Advanced Java Services | TestSuite |
Eine TestSuite ist eine Folge von Tests die zusammen und nacheinander ablaufen. Man kann in einer TestSuite verschiedene Tests kombinieren oder auch die gleichen Tests mehrmals wiederholen. Zum Erstellen einer TestSuite kann man einen Wizard benutzen, den den JUnit in Eclipse bereitstellt oder auch eine TestSuite selbst schreiben.
Am einfachsten ist es die schon vorhandene Testdatei des Projekts zu markieren, dann ist man gleich im richtigen Verzeichnis.
Kontextmenü -> New -> Other -> JUnit -> TestSuite
Wir akzeptieren den Namen "AllTests" und erhalten folgende Klasse.
import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses( {DatumTest.class} ) public class AllTests { }
Die Klasse bleibt leer. Die zweite Annotation steuert das Verhalten. Wollen wir verschiedene Tests zusammenbinden, so schreiben wir etwa
@SuiteClasses( {DatumTest.class, FooTest.class, FooTest2.class} )
Tests wiederholen kann man, indem man mehrere gleiche Einträge schreibt.
@SuiteClasses( {DatumTest.class, DatumTest.class, DatumTest.class} )
Wir legen in unserem Testverzeichnis zusätzlich zur vorhandenen Testklasse eine neue Klasse an, beispielweise mit dem Namen RepeatTests, und füllen sie wie folgt.
import junit.framework.Test; import junit.framework.TestSuite; public class RepeatTests { public static Test suite() { // leere TestSuite anlegen TestSuite suite = new TestSuite(); // TestSuite füllen for(int i = 0; i < 3; i++) { suite.addTestSuite(DatumTest.class); } // TestSuite zurückgeben (TestSuite implementiert das Interface Test) return suite; } }
Die Klasse muß eine statische Methode der obigen Form haben (static, Name der Methode, Typ des Returnwerts), damit JUnit die Methode aufrufen kann. Der Name der Klasse ist dagegen frei wählbar. Eine kleine Hürde bietet noch die Methode addTestSuite(), denn diese hat die Signatur void addTestSuite(java.lang.Class<? extends TestCase> testClass). Unsere Testklasse muß also von TestCase erben. Dies ist jedoch kein Aufwand, wir können
public class DatumTest
ergänzen zu
public class DatumTest extends TestCase
ohne zusätzliche Änderungen vornehmen zu müssen.
Nun markiert man die Datei RepeatTests im Package Explorer und ruft JUnit wie bisher.
Mit einer kleinen Änderung der vorigen TestSuite gelingt es, die Tests parallel laufen zu lassen. Mit der Klasse junit.extensions.ActiveTestSuite ist das recht einfach. In der API heißt es A TestSuite for active Tests. It runs each test in a separate thread and waits until all threads have terminated. Im wesentlichenersetzen wir nur zwei Wörter:
public class RepeatTests { public static Test suite() { ActiveTestSuite suite = new ActiveTestSuite(); for(int i = 0; i < 3; i++) { suite.addTestSuite(DatumTest.class); } return suite; } }
Läßt man die Suite mehrmals laufen so wird man sehen, daß sich die Reihenfolge des Ablaufs ändert. Ein typisches Zeichen dafür, daß mehrere Threads arbeiten.