Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

24
Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site

Transcript of Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Page 1: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit Testing with JUnit and Clover

Based on material from: Daniel AmyotJUnit Web site

Page 2: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 2

JUnit (http://www.junit.org)

A unit test framework for Java

• Authors: Erich Gamma, Kent Beck

• Part of XUnit family (HTTPUnit, Cactus), CppUnit

Essential part of the eXtreme Programming methodology, but can be used independently

Used for regression testing as well, but not for system testing

Integrated to Eclipse, but can be used standalone

Page 3: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 3

eXtreme Programming (XP) and unit testing

In XP, a test shall:• Be written first

— before any code• Executed

— will likely fail!Then:

• Implementation code should be written that would be the minimum code required to get the test to pass – and no extra functionality.

• Once the code is written, re-execute the test and it should pass.

• When needed, refactor the code mercilessly.— Improve performance, maintainability, readability

Page 4: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 4

Common XP day

Page 5: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 5

Some benefits of JUnit (and Test-Driven Development)

Testing is a Good Thing

Immediate gratification with build iterations

• Start with “The Simplest Thing That Could Possibly Work”.

• Green bar addiction!

Break the cycle of “more pressure means fewer tests”

• Whenever you are tempted to type something into a print statement or a debugger expression, write it as a test instead.”

Martin Fowler

Reduce code captivity

• If others can test it, others can work on it.

Page 6: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 6

What is a JUnit test?

A test “script” is just a collection of small Java methods.

• General idea is to create a few Java objects, do something interesting with them, and then determine if the objects have the correct properties.

What is added? Assertions!

• A package of methods that checks various properties:

— equality of variables

— identity of objects

• The assertions are used to determine the test case verdict.

Page 7: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 7

A JUnit test case

/** Test of copy method, class ProblemBase.Value */

public void testCopy() { System.out.println("testCopy"); Value v1 = new Value( ); v1.setName( "X" ); Value v2 = v1.copy( ); v1.setName( "Y" );

String expected = "X"; String actual = v2.getName( ); Assert.assertEquals( expected, actual ); }

Page 8: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 8

A JUnit test case

/** Test of copy method, class ProblemBase.Value */

public void testCopy() { System.out.println("testCopy"); Value v1 = new Value( ); v1.setName( "X" ); Value v2 = v1.copy( ); v1.setName( "Y" );

String expected = "X"; String actual = v2.getName( ); Assert.assertEquals( expected, actual ); }

Method signature: no parameters

Page 9: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 9

A JUnit test case

/** Test of copy method, class ProblemBase.Value */

public void testCopy() { System.out.println("testCopy"); Value v1 = new Value( ); v1.setName( "X" ); Value v2 = v1.copy( ); v1.setName( "Y" );

String expected = "X"; String actual = v2.getName( ); Assert.assertEquals( expected, actual ); }

Objective:create a duplicate

object, insteadof copyingreference

Page 10: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 10

A JUnit test case

/** Test of copy method, class ProblemBase.Value */

public void testCopy() { System.out.println("testCopy"); Value v1 = new Value( ); v1.setName( "X" ); Value v2 = v1.copy( ); v1.setName( "Y" );

String expected = "X"; String actual = v2.getName( ); Assert.assertEquals( expected, actual ); }

Check for a condition that should not be violated

Page 11: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 11

A JUnit test class

import junit.framework.*;

// Each test class must extend the Junit// TestCase class

public class CopyTest extends TestCase {

// Must provide a constructor with String // argument

public CopyTest(String name) { super(name); }

// Insert your test cases here. setup(), // tearDown() and main() methods can also be // added.

}

Page 12: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 12

Assertions and verdicts

Assertions are defined in the special JUnit class Assert• If the assertions are true, the method continues

executing.• If any assertion is false, the method stops executing,

and the result for the test case will be “fail”.• If any other exception is thrown during the method,

the result for the test case will be “error”.• If no assertions were violated for the entire method,

the test case will “pass”.

The Assert class name is often not required• assertEquals( expected, actual );

Page 13: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 13

Assertion methods

Assertion methods can verify:

• Objects are identical, or not identical

• Objects are null or non-null

• “Equality” of objects

— via == or equals() depending on type

• Boolean conditions are true or false

There is also an unconditional failure method.

Page 14: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 14

JUnit execution (with failures)

Page 15: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 15

JUnit execution (success!)

Page 16: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 16

JUnit plugin for Eclipse

Page 17: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 17

run(TestResult)addTest()

TestSuite

run(TestResult)

Test

*suite(): TestSuite

AnotherTestClass

run(TestResult)runTest()setup()

tearDown()

fName

TestCase

Your tests here.*suite(): TestSuite

ATestClass

fTests

TestResult

JUnit framework

Page 18: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 18

Some benefits of this framework

No major difference between a test case and a test suite• Both can be invoked using the run() method• Test cases are often associated with methods, and test

suites with classesUses reflection to lean about classes and methods

• Test suite structure discovered at run time• Test suites can invoke the test cases automatically

Common setup and teardown (clean up) for all test cases in a test suite

• Default ones can be overridenIntegrated to Uis, and wizard for test creationsSimple, efficient, and automated!

Page 19: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 19

Java code coverage tool: Clover

• Discovers sections of code that are not being adequately exercised by your (unit) tests.

• Supports method, statement, and branch coverage

• Reports its findings in multiple formats

— From project level down to individual lines of source code

• Historical charting of code coverage and other metrics

• Integrated to Eclipse and other IDEs

• http://www.thecortex.net/clover/index.html

Page 20: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 20

Clover plugin for Eclipse

Page 21: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 21

Clover coverage filters

One can choose not to instrument certain types of blocks in the code (e.g. assertions and exception catching), in order to focus on the coverage of interest.

Page 22: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 22

Clover plugin caveats

• This plugin may (very likely!) not work correctly if you have configured your Eclipse project so that the Java source and output directories are the same.

— Use different directories for the original source code and instrumented source code

• When compiling your Java project with the Clover plugin, you must add and use a Java Development Kit (JDK) to your list of Installed JRE locations (see instructions).

• Not free software…

Page 23: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 23

Fixing the Clover plugin caveats

Page 24: Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.

Unit testing with Junit and Clover 24

For more information

JUnit Web site

• http://junit.org

Documentation on installation and use of JUnit

• E. Gamma, K. Beck, “JUnit Cookbook”

• http://junit.sourceforge.net/doc/cookbook/cookbook.htm

Internals of JUnit

• “JUnit: A Cook’s Tour”

• http://junit.sourceforge.net/doc/cookstour/cookstour.htm

Clover Eclipse Plugin (with installation instructions)

• http://www.thecortex.net/clover/userguide/eclipse/