1 junit. 2 unit testing with junit if code has no automated test case written for it to prove that...
DESCRIPTION
3 Don't have the time for unit test? Productivity is directly related to the stability of your code base. – The fewer test cases you write, the less stable your code base becomes. – You spend all your time fixing unintended side effects and bugs.TRANSCRIPT
1
JUnit
2
Unit Testing with JUnit
• If code has no automated test case written for it to prove that it works, it must be assumed not to work.
• An API that does not have an automated test case to show how it works must be assumed un-maintainable.
• Software without automated test cases cannot be economically refactored. Software that that cannot be refactored cannot be extended economically.
3
Don't have the time for unit test?
• Productivity is directly related to the stability of your code base.– The fewer test cases you write, the less s
table your code base becomes.– You spend all your time fixing unintende
d side effects and bugs.
4
Where to Get JUnit
• JUnit was written by Erich Gamma and Kent Beck.
• http://www.junit.org/index.htm
5
System.out.println is Not Enough
• It is hard to tell if a complex system is working because so many System.out.println methods are printing so much garbage.
• Second, you must determine if something works by looking at a String scrolling by on a console. The string of text scrolling by may make sense the day you wrote it, but will it still make sense in three months?
• Third, when you make changes, things can break in unexpected ways.
6
Overview of JUnit
• JUnit is a framework for writing unit tests.• A test case defines a fixture to run a
related set of tests. Typically, every class that you write should have a test case.
• A test fixture provides resources: primitive variables and objects that tests need to run.
• A test suite is a collection of related test cases.
7
Practice• 1. Subclass junit.framework.TestCase.• 2. If we need fixture objects, override the setUp
() method.• 3. Define a number of tests that return void and
whose method name begins with test, such as testAdd(), testPut(), and testIterator().
• 4. If we need to release resources that were part of the fixture, override the tearDown() method.
• 5. If we need to group a related set of test cases, define a suite of tests.
8
An examplepackage xptoolkit.junit.example;
import junit.framework.*;import java.util.Map;import java.util.HashMap;import junit.extensions.*;public class HashMapTest extends TestCase {
private Map testMap; private Map testMap2; public HashMapTest(String name) { super(name); }
public static Test suite() { return new TestSuite(HashMapTest.class); }
9
public static void main (String[] args) { junit.textui.TestRunner.run (suite()); } private static final String APPLE_KEY = "AppleCEO"; private static final String APPLE_VALUE = "AppleCEO"; protected void setUp() { testMap = new HashMap(); testMap.put(APPLE_KEY, APPLE_VALUE); testMap.put("OracleCEO","Larry Ellison"); testMap2 = new HashMap(); testMap2.put("1", "1"); testMap2.put("2", "2"); }
10
public void testPut(){ String key = "Employee"; String value = "Rick Hightower"; //put the value in testMap.put(key, value); //read the value back out String value2 = (String)testMap.get(key); assertEquals("The value back from the map ", value, value2); } public void testSize(){ assertEquals (2, testMap.size()); } public void testGet(){ assertEquals(APPLE_VALUE, testMap.get(APPLE_KEY)); assertNull(testMap.get("JUNK_KEY")); }
11
public void testPutAll(){ testMap.putAll(testMap2); assertEquals (4, testMap.size()); assertEquals("1", testMap.get("1")); testGet(); } public void testContainsKey(){ assert("It should contain the apple key", testMap.containsKey(APPLE_KEY)); }
public void testContainsValue(){ assert(testMap.containsKey(APPLE_VALUE)); }
12
public void testRemove(){ String key = "Employee"; String value = "Rick Hightower"; //put the value in testMap.put(key, value); //remove it testMap.remove(key); //try to read the value back out assertNull(testMap.get(key));
} }
13
Explanation 1
• Step 1 is to define a class that derives junit.framework.
import junit.framework.*;...public class HashMapTest extends TestCase {
14
Explanation 2
• Next, if our test case needs a fixture, we override the setUp() method
protected void setUp() { testMap = new HashMap(); testMap.put(APPLE_KEY, APPLE_VALUE); testMap.put("OracleCEO","Larry Ellison"); testMap2 = new HashMap(); testMap2.put("1", "1"); testMap2.put("2", "2"); }
the fixture the test case sets up is actually instances of the class under test: the HashMapclass. Garbage-collection will destroy the object.
15
Explanation 3
• The HashMapTest class defines several tests to test the HashMap class.
• The JUnit framework uses reflection to look for methods whose names begin with test and uses them as test cases.
16
Explanation 4
• It does this when we invoke the TestSuite constructor in the static suite() method,
public static Test suite() { return new TestSuite(HashMapTest.class); }
the composite design pattern
17
Explanation 5
• assertEquals()• assertTrue()
18
Explanation 6
• Note that the setUp() and tearDown() methods are called before and after every textX() method that is run.
• Because the setUp() method does not allocate any resources that need to be released, the HashMapTest does not need to override the tearDown() method.
19
JUnit and Ant
• Copy junit.jar to Ant’s lib directory.<project name="currency" default="test" basedir="."> <property name="lib" value="./lib"/> <property name = "report" value="./report" /> <path id="lib1"> <pathelement location="."/> <fileset dir="${lib}"> <include name="**/*.jar"/> </fileset> </path> <target name="init"> <property name="outdir" value = "class"/> </target> <target name="prepare" depends="init"> <mkdir dir="${outdir}"/> <mkdir dir="${report}"/> </target>
20
<target name="compile" depends="prepare"> <javac srcdir ="./src" destdir = "${outdir}"> <classpath refid="lib1"/> </javac> </target> <target name="test" depends="compile"> <junit printsummary = "true"> <formatter type="xml" /> <test name="TestCurrency" todir="${report}"/> <classpath> <pathelement location="${outdir}"/> </classpath> </junit> <junitreport todir="report"> <fileset dir ="${report}" > <include name = "TEST-*.xml"/> </fileset> <report format="frames" todir="${report}/html"/> </junitreport> </target> <target name="clean"> <delete dir="${report}"/> </target></project>
21
22
Reading work
• http://junit.sourceforge.net/doc/cookbook/cookbook.htm