5. Testing phases
• Unit Testing on individual units of source
code (mostly methods)
• Integration Testing on groups of individual
software modules
• System testing on a complete end-to-end
system
5
6. Example: Assignment 2
• PolygonImpl
– Create a polygon with „n‟ points
– Compute area
– Compute centroid
• How to test if the functionality implemented
is correct ? Use JUnit
6
7. Installing JUnit
• Eclipse users – You are in good shape. JUnit
is already installed for you !
• Caveat: Make sure you are using JUnit4
instead of JUnit3, update if required
• Ubuntu - sudo apt-get install junit4
7
8. JUnit Demo Source Code
• JUnit Demo Source Code
– Online (tiny url):
http://bit.ly/XG97oO
– Online (source) :
https://docs.google.com/a/cs.unc.edu/file/d/0B3luEI_yhbZWMm
RpQTlHS2pGNE0/edit?usp=sharing
– Delete/Rename PolygonImplTest.java if you want to code it
during this session
8
12. Testing in JUnit
• Tests are written as “public void testX()”
methods (good practice).
• Use @Test annotation to mark a method
as a test case. (compulsory)
• Annotations provide data about a program
that is not part of the program itself.
12
13. Annotations
• @Test – mark a method as test
• @BeforeClass – run once before all tests
• @AfterClass – run once after all tests
• @Before – called before every testX()
• @After – called after every testX()
13
15. Part I : Initialize
package demo;
import static org.junit.Assert.assertEquals;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class PolygonImplTest{
private PolygonImpl p;
// One Time Setup
@BeforeClass
public void runOnceBeforeAllTests(){
}
// Tear down after all tests
@AfterClass
public void runAfterAllTests(){
}
15
16. Part I : Initialize (Setup)
// Creates test environment (fixture).
// Called before every testX() method.
@Before
public void setUp() throws Exception {
Point a = new Point(-1, -2);
Point b = new Point(-2.5, -3.5);
Point c = new Point(-3.1, -1.4);
Point d = new Point(-2, 1.3);
Point e = new Point(1, 1);
Point f = new Point(2, 3);
Point g = new Point(3, 0.5);
Point h = new Point(5, 2.5);
Point i = new Point(4, -2);
Point j = new Point(1.5, -1.5);
Point[] poly_points = new Point[] {a, b, c, d, e, f, g, h, i, j};
this.p = new PolygonImpl(poly_points)
} 16
17. Part I : Initialize (Tear Down)
// Releases test environment (fixture).
// Called after every testX() method.
@After
public void tearDown() throws Exception {
p = null;
}
17
18. Part II: Write Test Cases
• Helper methods to test:
fail(msg) – triggers a failure named msg
assertTrue(msg, b) – triggers a failure, when condition b is false
assertEquals(msg, v1, v2) – triggers a failure, when v1 == v2 is false ✓
assertEquals(msg, v1, v2, eps) – triggers a failure, if abs(v1 – v2) > eps ✓
assertNull(msg, object) – triggers a failure, when object is not null
assertNonNull(msg, object) – triggers a failure, when object is null
The parameter msg is optional 18
19. Test getArea() and getCentroid()
@Test
public void testPolygonArea() {
assertEquals("P1: polygon area is wrong", p.getArea(), 24.24, 0.01);
}
@Test
public void testPolygonCentroid() {
Point centroid = p.getCentroid();
assertEquals("P2: centroid (x) is wrong", centroid.getX(), 0.7646, 0.01);
assertEquals("P2: centroid (y) is wrong", centroid.getY(), -0.3067, 0.01);
//The below assertion will print an AssertionFailedError, can you tell me
why ?
//But it may also pass with some modification to Point class
assertEquals("P2: centroid is wrong", p.getCentroid(), new Point(0.7646,
-0.3067));
}
19
24. Part III : Writing a Test Suite
• In JUnit 3.8, you had to add a suite() method to
your classes to run all tests as a suite.
• With JUnit 4.0, you can use annotations instead.
• To run the PolygonImplTest, you write an empty
class with @RunWith and @Suite annotations.
• Very useful when you need to batch and run all the
test classes in one shot.
24
25. Part III : All tests in one shot
package demo;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({PolygonImplTest.class})
public class PolygonImplTestSuite {
//Empty Class
}
25
27. Eclipse
• Auto resolve package dependency
– Ctrl + Shift + O
• Auto format code (helps when you paste
non-formatted code)
– Ctrl + Shift + F
• vim-like editing in Eclipse - vrapper
27
29. Best Practices
• Test Everything that can possibly break.
• Test I/O, nulls and boundary conditions,
they are always the big culprits.
• Test Driven Development (TDD)
– TestCase Code Pass Test Refactor
29
30. Summary
• Testing • Self Study / Explore
– Unit Testing – How to test private and
– Integration Testing protected methods?
– System Testing
– How to test methods which
take input from console
• Junit (and | or) dump output to
– Initialize console ?
– Write Test Cases
– Batch Test Cases – How to test methods that
(TestSuite) don‟t return or print
– Execute Test Case anything to the console ?
– How to test exceptions ?
30