• Like
Unit Testing with JUnit4 by Ravikiran Janardhana
Upcoming SlideShare
Loading in...5
×

Unit Testing with JUnit4 by Ravikiran Janardhana

  • 708 views
Uploaded on

Unit Testing with JUnit4

Unit Testing with JUnit4

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
708
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
30
Comments
2
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Unit Testing with JUnit 4 Ravikiran JanardhanaCOMP 401: Foundations of Programming UNC – Chapel Hill 1
  • 2. Source: http://www.leonardscomic.com/comic/68/unit-testing/ 2
  • 3. TestingTesting is the activity of finding out whether apiece of code (method / program) producesthe intended behavior. 3
  • 4. 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 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
  • 9. Creating a new JUnit TestCase 9
  • 10. Creating a new JUnit TestCase 10
  • 11. Creating a new JUnit TestCase 11
  • 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
  • 14. 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 @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.@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. Part I : Initialize (Tear Down)// Releases test environment (fixture).// Called after every testX() method.@Afterpublic 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()@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. Junit Test ResultSource: www.lordoftherings.net 20
  • 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. 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. Junit Test Result 23
  • 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 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. 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. 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. 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. 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
  • 31. 31
  • 32. Q&AMany of the slides are attributed to Thomas Zimmermann 32