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

Unit Testing with JUnit4 by Ravikiran Janardhana



Unit Testing with JUnit4

Unit Testing with JUnit4



Total Views
Views on SlideShare
Embed Views



2 Embeds 2

http://www.docseek.net 1
http://www.docshut.com 1



Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
Post Comment
Edit your comment

Unit Testing with JUnit4 by Ravikiran Janardhana Unit Testing with JUnit4 by Ravikiran Janardhana Presentation Transcript

  • Unit Testing with JUnit 4 Ravikiran JanardhanaCOMP 401: Foundations of Programming UNC – Chapel Hill 1
  • 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. 3
  • 4
  • 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
  • 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
  • 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
  • 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
  • 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 method as a test case. (compulsory)• Annotations provide data about a program that is not part of the program itself. 12
  • 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
  • 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
  • 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
  • Part I : Initialize (Tear Down)// Releases test environment (fixture).// Called after every testX() method.@Afterpublic void tearDown() throws Exception { p = null;} 17
  • 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
  • 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
  • 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() method in Point class. 21
  • 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
  • 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 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • Q&AMany of the slides are attributed to Thomas Zimmermann 32