Lehrveranstaltung Softwaretechnologie II Übung Aufgabe 13: Testen mit JUnit Bearbeiter: Jürgen Ebert ([email protected]) Übungsgruppe Freitag Framework Von Erich Gamma und Kent Beck Unit Testing Teil von XP (Kent Beck) jede Klasse braucht einen Test jeder Test muss zu 100% erfüllt werden eine Klasse ist nicht fertig, bevor ihr Test in der TestSuite steckt Empfehlung: Test vor der Klasse schreiben, dies ermöglicht Fokus auf tatsächliche Funktion einer Klasse ermöglicht ständiges Sicherstellen von Funktionalität auf Klassen-/Packageebene Black Box Testing / White Box Testing / Regression Tests wichtig bei Verwendung von CVS bzw. generell bei gemeinsamen Codebesitz neben Java gibt es auch XUnit für Smalltalk, C++ und viele andere Sprachen aktuell Version 3.2 Klassentests lassen sich zu TestSuits (Packageebene) zusammenfassen Test laufen immer automatisch, keine Eingaben durch Nutzer erforderlich/erwünscht Testdaten sollten konstant bleiben (keine Zufallsdaten), damit Ergebnisse nachvollziehbar sind www.junit.org / www.xprogramming.com Constructor Summary TestCase(java.lang.String name) Constructs a test case with the given name. Method Summary int countTestCases() Counts the number of test cases executed by run(TestResult result). protected createResult() TestResult Creates a default TestResult object java.lang.String name() Gets the name of the test case. TestResult run() A convenience method to run this test, collecting the results with a default TestResult object. void run(TestResult result) Runs the test case and collects the results in TestResult. void runBare() Runs the bare test sequence. protected void runTest() Override to run the test and assert its state. protected void setUp() Sets up the fixture, for example, open a network connection. protected void tearDown() Tears down the fixture, for example, close a network connection. java.lang.String toString() Returns a string representation of the test case Methods inherited from class junit.framework.Assert assert, assert, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertNotNull, assertNotNull, assertNull, assertNull, assertSame, assertSame, fail, fail Allgemeines Vorgehen: Erstellen einer Unterklasse von TestCase für jede zu testende Klasse gleiches Package für Tests von protected Methoden Erstellen einer Methode public void test*() für jede zu testende Methode dieser Klasse, wobei * = Name der zu testenden Methode Testen von Ergebnissen mittels assert Optional: setUp und tearDown für Auf- und Abbau einer speziellen Umgebung vor und nach jedem Test Optional: Zusammenfassen mehrerer TestCase zu einer TestSuite Starten des Testdurchlaufs mittels java junit.*.TestRunner Test (* entweder ui, swingui oder textui) Alle Tests eines TestCase laufen nacheinander ab Ergebnis: ok, failed (ein assert schlug fehl) oder error (eine nicht abgefangene Exception) Vorteile von Junit: einfaches Testen einzelner Klassen Regressionstests Tests dienen als Spezifikation Nachteile von JUnit: nur Test der Businesslogik, keine UI-Tests Tests schlecht überprüfbar package swt.junit; import java.util.Vector; import java.util.Iterator; /** * Sorts a <code>Vector</code> of <code>Object</code>s * by <code>toString()</code> values, ascending * @version $Revision: 1.2 $, $Date: 2000/11/19 23:04:31 $ */ public class ObjectSort { /** * Creates a new sorted Vector, does not change the original * @param anUnsortedVector the Vector which has to be sorted * @return a new sorted Vector */ public static Vector sort(Vector anUnsortedVector) { Vector result = new Vector(); Vector source = (Vector) anUnsortedVector.clone(); while (!source.isEmpty()) { String minimalString = source.firstElement().toString(); Object minimalObject = source.firstElement(); Iterator it = source.iterator(); while(it.hasNext()) { Object object = it.next(); if (object.toString().compareTo(minimalString)<0) { minimalString = object.toString(); minimalObject = object; } } result.add(minimalObject); source.remove(minimalObject); } return result; } } package swt.junit; import junit.framework.*; import java.util.Vector; import java.util.Iterator; /** * @version $Revision: 1.1 $, $Date: 2000/11/19 23:04:32 $ */ public class ObjectSortTest extends TestCase { public ObjectSortTest(String name) { super(name); } public void testSort() { Vector unsorted = new Vector(); String a = "a"; String b1 = "b"; String b2 = "b"; String c = "c"; unsorted.add(c); unsorted.add(b1); unsorted.add(b2); unsorted.add(a); assert( unsorted.size()==4 ); Vector sorted = ObjectSort.sort(unsorted); assert( assert( assert( assert( assert( unsorted.size()==4 ); unsorted.get(0)==c ); unsorted.get(1)==b1 ); unsorted.get(2)==b2 ); unsorted.get(3)==a ); assert( sorted.size()==4 ); assert( sorted.get(0)==a ); assert( (sorted.get(1)==b1 && sorted.get(2)==b2) || (sorted.get(1)==b2 && sorted.get(2)==b1) ); assert( sorted.get(3)==c ); } public static Test suite() { TestSuite suite= new TestSuite(); suite.addTest(new ObjectSortTest("testObjectSort")); suite.addTest(new DoSomethingElseTest("testDoSomethingElse")); return suite; } }