Jürgen Ebert

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