32
Unit Testing with JUnit 4 Ravikiran Janardhana COMP 401: Foundations of Programming UNC – Chapel Hill 1

Unit Testing with JUnit4 by Ravikiran Janardhana

Embed Size (px)

DESCRIPTION

Unit Testing with JUnit4

Citation preview

Page 1: Unit Testing with JUnit4 by Ravikiran Janardhana

1

Unit Testing with JUnit 4

Ravikiran Janardhana

COMP 401: Foundations of Programming

UNC – Chapel Hill

Page 2: Unit Testing with JUnit4 by Ravikiran Janardhana

2Source: http://www.leonardscomic.com/comic/68/unit-testing/

Page 3: Unit Testing with JUnit4 by Ravikiran Janardhana

3

Testing

Testing is the activity of finding out whether a piece of code (method / program) produces the intended behavior.

Page 4: Unit Testing with JUnit4 by Ravikiran Janardhana

4

Page 5: Unit Testing with JUnit4 by Ravikiran Janardhana

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

Page 6: Unit Testing with JUnit4 by Ravikiran Janardhana

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

Page 7: Unit Testing with JUnit4 by Ravikiran Janardhana

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

Page 8: Unit Testing with JUnit4 by Ravikiran Janardhana

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

Page 9: Unit Testing with JUnit4 by Ravikiran Janardhana

9

Creating a new JUnit TestCase

Page 10: Unit Testing with JUnit4 by Ravikiran Janardhana

10

Creating a new JUnit TestCase

Page 11: Unit Testing with JUnit4 by Ravikiran Janardhana

11

Creating a new JUnit TestCase

Page 12: Unit Testing with JUnit4 by Ravikiran Janardhana

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.

Page 13: Unit Testing with JUnit4 by Ravikiran Janardhana

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()

Page 14: Unit Testing with JUnit4 by Ravikiran Janardhana

14

Page 15: Unit Testing with JUnit4 by Ravikiran Janardhana

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(){

}

Page 16: Unit Testing with JUnit4 by Ravikiran Janardhana

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)

}

Page 17: Unit Testing with JUnit4 by Ravikiran Janardhana

17

Part I : Initialize (Tear Down)// Releases test environment (fixture).// Called after every testX() method.@Afterpublic void tearDown() throws Exception {

p = null;}

Page 18: Unit Testing with JUnit4 by Ravikiran Janardhana

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

Page 19: Unit Testing with JUnit4 by Ravikiran Janardhana

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));

}

Page 20: Unit Testing with JUnit4 by Ravikiran Janardhana

20

Junit Test Result

Source: www.lordoftherings.net

Page 21: Unit Testing with JUnit4 by Ravikiran Janardhana

21

Junit Test Result

• The “==“ operator compares the reference of the variable.

• To fix it, override the Object.equals() method in Point class.

Page 22: Unit Testing with JUnit4 by Ravikiran Janardhana

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;}

Page 23: Unit Testing with JUnit4 by Ravikiran Janardhana

23

Junit Test Result

Page 24: Unit Testing with JUnit4 by Ravikiran Janardhana

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.

Page 25: Unit Testing with JUnit4 by Ravikiran Janardhana

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}

Page 26: Unit Testing with JUnit4 by Ravikiran Janardhana

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

Page 27: Unit Testing with JUnit4 by Ravikiran Janardhana

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

Page 28: Unit Testing with JUnit4 by Ravikiran Janardhana

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

Page 29: Unit Testing with JUnit4 by Ravikiran Janardhana

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

Page 30: Unit Testing with JUnit4 by Ravikiran Janardhana

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 ?

Page 31: Unit Testing with JUnit4 by Ravikiran Janardhana

31

Page 32: Unit Testing with JUnit4 by Ravikiran Janardhana

32

Q&A

Many of the slides are attributed to Thomas Zimmermann