Unit Testing with JUnit 4       Ravikiran JanardhanaCOMP 401: Foundations of Programming          UNC – Chapel Hill       ...
Source: http://www.leonardscomic.com/comic/68/unit-testing/   2
TestingTesting is the activity of finding out whether apiece of code (method / program) producesthe intended behavior.    ...
4
Testing phases• Unit Testing on individual units of source  code (mostly methods)• Integration Testing on groups of indivi...
Example: Assignment 2• PolygonImpl  – Create a polygon with „n‟ points  – Compute area  – Compute centroid• How to test if...
Installing JUnit• Eclipse users – You are in good shape. JUnit  is already installed for you  !• Caveat: Make sure you ar...
JUnit Demo Source Code• JUnit Demo Source Code  – Online (tiny url):     http://bit.ly/XG97oO  – Online (source) :     htt...
Creating a new JUnit TestCase                                9
Creating a new JUnit TestCase                                10
Creating a new JUnit TestCase                                11
Testing in JUnit• Tests are written as “public void testX()”  methods (good practice).• Use @Test annotation to mark a met...
Annotations• @Test – mark a method as test• @BeforeClass – run once before all tests• @AfterClass – run once after all tes...
14
Part I : Initializepackage demo;import static org.junit.Assert.assertEquals;import   org.junit.After;import   org.junit.Af...
Part I : Initialize (Setup)// Creates test environment (fixture).// Called before every testX() method.@Beforepublic void ...
Part I : Initialize (Tear Down)// Releases test environment (fixture).// Called after every testX() method.@Afterpublic vo...
Part II: Write Test Cases• Helper methods to test:  fail(msg) – triggers a failure named msg  assertTrue(msg, b) – trigger...
Test getArea() and getCentroid()@Testpublic void testPolygonArea() {       assertEquals("P1: polygon area is wrong", p.get...
Junit Test ResultSource: www.lordoftherings.net                                 20
Junit Test Result• The “==“ operator compares the reference of the variable.• To fix it, override the Object.equals() meth...
Override equals()@Overridepublic boolean equals(Object obj){ //Parameter is of type Object    if(obj == null) return false...
Junit Test Result                    23
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 suit...
Part III : All tests in one shotpackage demo;import org.junit.runner.RunWith;import org.junit.runners.Suite;@RunWith(Suite...
Part IV: Executing Tests• Eclipse – Ctrl + F11 (run), F11 (debug)• Command line[ravikirn@xps demo]# javac -cp /usr/share/j...
Eclipse• Auto resolve package dependency  – Ctrl + Shift + O• Auto format code (helps when you paste  non-formatted code) ...
vim / emacs  • Trust me, it‟s totally worth learning vim / emacs  • http://www.openvim.com/tutorial.html  • http://www.der...
Best Practices• Test Everything that can possibly break.• Test I/O, nulls and boundary conditions,  they are always the bi...
Summary• Testing                  • Self Study / Explore   – Unit Testing             – How to test private and   – Integr...
31
Q&AMany of the slides are attributed to Thomas Zimmermann                                                         32
Upcoming SlideShare
Loading in...5
×

Unit Testing with JUnit4 by Ravikiran Janardhana

1,011

Published on

Unit Testing with JUnit4

Published in: Education
2 Comments
2 Likes
Statistics
Notes
No Downloads
Views
Total Views
1,011
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
49
Comments
2
Likes
2
Embeds 0
No embeds

No notes for slide

Unit Testing with JUnit4 by Ravikiran Janardhana

  1. 1. Unit Testing with JUnit 4 Ravikiran JanardhanaCOMP 401: Foundations of Programming UNC – Chapel Hill 1
  2. 2. Source: http://www.leonardscomic.com/comic/68/unit-testing/ 2
  3. 3. TestingTesting is the activity of finding out whether apiece of code (method / program) producesthe intended behavior. 3
  4. 4. 4
  5. 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. 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. 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. 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
  9. 9. Creating a new JUnit TestCase 9
  10. 10. Creating a new JUnit TestCase 10
  11. 11. Creating a new JUnit TestCase 11
  12. 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. 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
  14. 14. 14
  15. 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 @BeforeClass public void runOnceBeforeAllTests(){ } // Tear down after all tests @AfterClass public void runAfterAllTests(){ } 15
  16. 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)} 16
  17. 17. Part I : Initialize (Tear Down)// Releases test environment (fixture).// Called after every testX() method.@Afterpublic void tearDown() throws Exception { p = null;} 17
  18. 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. 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 class assertEquals("P2: centroid is wrong", p.getCentroid(), new Point(0.7646, -0.3067));} 19
  20. 20. Junit Test ResultSource: www.lordoftherings.net 20
  21. 21. Junit Test Result• The “==“ operator compares the reference of the variable.• To fix it, override the Object.equals() method in Point class. 21
  22. 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;} 22
  23. 23. Junit Test Result 23
  24. 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. 25. Part III : All tests in one shotpackage demo;import org.junit.runner.RunWith;import org.junit.runners.Suite;@RunWith(Suite.class)@Suite.SuiteClasses({PolygonImplTest.class})public class PolygonImplTestSuite { //Empty Class} 25
  26. 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.javaPoint.java PolygonImplTest.java[ravikirn@xps src]# java -cp /usr/share/java/junit4.jar:. org.junit.runner.JUnitCoredemo.PolygonImplTest 26
  27. 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
  28. 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 28
  29. 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. 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
  31. 31. 31
  32. 32. Q&AMany of the slides are attributed to Thomas Zimmermann 32
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×