Unit Testing with JUnit4 by Ravikiran Janardhana
-
Upload
ravikiran-j -
Category
Education
-
view
901 -
download
3
description
Transcript of Unit Testing with JUnit4 by Ravikiran Janardhana
1
Unit Testing with JUnit 4
Ravikiran Janardhana
COMP 401: Foundations of Programming
UNC – Chapel Hill
2Source: http://www.leonardscomic.com/comic/68/unit-testing/
3
Testing
Testing is the activity of finding out whether a piece of code (method / program) produces the intended behavior.
4
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
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
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
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_yhbZWMmRpQTlHS2pGNE0/edit?usp=sharing
– Delete/Rename PolygonImplTest.java if you want to code it during this session
9
Creating a new JUnit TestCase
10
Creating a new JUnit TestCase
11
Creating a new JUnit TestCase
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.
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()
14
15
Part I : Initializepackage 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@BeforeClasspublic void runOnceBeforeAllTests(){
}// Tear down after all tests@AfterClasspublic void runAfterAllTests(){
}
16
Part I : Initialize (Setup)// Creates test environment (fixture).// Called before every testX() method.@Beforepublic 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)
}
17
Part I : Initialize (Tear Down)// Releases test environment (fixture).// Called after every testX() method.@Afterpublic void tearDown() throws Exception {
p = null;}
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
19
Test getArea() and getCentroid()@Testpublic void testPolygonArea() {
assertEquals("P1: polygon area is wrong", p.getArea(), 24.24, 0.01);}
@Testpublic 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 classassertEquals("P2: centroid is wrong", p.getCentroid(), new Point(0.7646, -0.3067));
}
20
Junit Test Result
Source: www.lordoftherings.net
21
Junit Test Result
• The “==“ operator compares the reference of the variable.
• To fix it, override the Object.equals() method in Point class.
22
Override equals()
@Overridepublic boolean equals(Object obj){ //Parameter is of type Object if(obj == null) return false; if(obj == this) return true; if(!(obj instanceof Point)) return false;
Point q = (Point) obj; if(Math.abs(this.getX() - q.getX()) < 0.01 &&
Math.abs(this.getY() - q.getY()) < 0.01){ return true;
} return false;}
23
Junit Test Result
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.
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}
26
Part IV: Executing Tests
• Eclipse – Ctrl + F11 (run), F11 (debug)
• Command line
[ravikirn@xps demo]# javac -cp /usr/share/java/junit4.jar PolygonImpl.java Polygon.java Point.java PolygonImplTest.java
[ravikirn@xps src]# java -cp /usr/share/java/junit4.jar:. org.junit.runner.JUnitCore demo.PolygonImplTest
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
28
vim / emacs
• Trust me, it’s totally worth learning vim / emacs• http://www.openvim.com/tutorial.html• http://www.derekwyatt.org/vim/vim-tutorial-videos/
img source: http://www.thejach.com/view/2012/07/vims_learning_curve_is_wrong
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
30
Summary
• Testing– Unit Testing– Integration Testing– System Testing
• Junit– Initialize– Write Test Cases– Batch Test Cases
(TestSuite)– Execute Test Case
• Self Study / Explore– How to test private and
protected methods?
– How to test methods which take input from console (and | or) dump output to console ?
– How to test methods that don’t return or print anything to the console ?
– How to test exceptions ?
31
32
Q&A
Many of the slides are attributed to Thomas Zimmermann