Seit langem erwartet, endlich erschienen und mittlerweile überfällig: JUnit 4. Das neueste Release ist jetzt über die Sourceforge-Seite von JUnit verfügbar. Die eigentliche Webseite wurde bisher nicht aktualisiert. Vor diesem Release haben die Macher von JUnit 4 Entwickler-Releases im Archivsystem (CVS) bereitgestellt, um mithilfe umfangreicher Diskussionen, etwa über die JUnit-Mailing-Liste, ein Feedback der Benutzer zu erhalten. Die Notwendigkeit eines neuen Releases war in den Diskussionen zu spüren. Der junge Rivale TestNG, ebenfalls ein Test-Framework, verstärkte den Druck.
Im Zeichen von Java 5
JUnit 4 basiert im Gegensatz zu früheren Releases auf Java 5 und ist nicht unter niedrigeren Java-Releases lauffähig. Die neuen Java-Sprachkonstrukte Annotations, Generics und Varargs fanden Einzug in JUnit 4. Wichtigste Neuerung ist die Einführung der Annotations. Annotations sind in Java 5 eingeführte Sprachkonstrukte, die es erlauben, Metadaten im Programmtext anzubringen. Diese Metadaten werden von JUnit 4 ausgewertet. Die Annotation @Test ist wohl die wichtigste, denn sie kennzeichnet eine Methode als Testmethode. Das bedeutet, die frühere Namenskonventionen, eine solche Methode mit dem Präfix "test" beginnen zu lassen, ist hinfällig. Eine Testmethode hat nun etwa folgende Gestalt:
@Test public void meinTest() {
int ergebnis = multiplikation(2,3)
assertEquals(6, ergebnis);
}
Analog erlauben es die Annotationen @Before und @After, die früher mit setUp() und tearDown() bezeichneten Methoden zu kennzeichnen, die Initialisierungen und Aufräumarbeiten vor bzw. nach jedem Testfall durchführen. Dies wird nun auch auf Klassenebene unterstützt, und zwar mit @BeforeClass und @AfterClass. Früher musste hierfür getrickst werden, etwa durch Einführen eines statischen Blocks. Ebenfalls neu ist die Möglichkeit, einen Testfall als momentan nicht produktiv zu kennzeichnen. Die Annotation hierfür lautet @Ignore.
Zum Testen einer Logik auf erwartete Ausnahmen (Exceptions) blieb mit früheren JUnit-Versionen nur der Weg über einen try-catch-Block. In den Fällen, wo es nur darum geht, zu prüfen, ob eine bestimmte Ausnahme geprüft wird, kann die Umsetzung nun dementsprechend vereinfacht werden. Die Annotation @Test, die oben bereits erwähnt wurde, besitzt einen optionalen Parameter namens "expected". Er wird mit der erwarteten Ausnahmeklasse versorgt und fertig. Es ist damit allerdings nicht möglich, weitere Eigenschaften des Ausnahme-Objekts zu prüfen, etwa den Meldungstext.
Eine recht simple Möglichkeit, die Laufzeit eines Testfalls zu begrenzen, bietet die Annotation @Timeout. Nach Überschreitung der damit angegebenen Zeit in Millisekunden schlägt der Test fehl. In Multitasking-Umgebungen, deren Hardware zudem differieren kann, ist dieses Vorgehen jedoch fragwürdig.
Zur Gewährleistung der Abwärtskompatibilität bietet JUnit 4 eine Serviceklasse namens JUnit4TestAdapter zur Ausführung alter Testfälle an.
Fazit
Die Verwendung von Annotationen ist sauberer und mächtiger, als spezielle Methoden über dedizierte Namen und Namensräume (Präfix "test") zu identifizieren. Allerdings ist deren Verwendung gewöhnungsbedürftig. Einen Methodennamen schnell hinzuschreiben ist für viele bequemer, als eine Annotation anzubringen. Auch der Zwang, die neue Java-Version verwenden zu müssen, ist für manches Projekt sicher nicht optimal. Der Schritt hin zu einem neuen Paradigma war für JUnit aber notwendig. Einerseits wegen der Konkurrenzsituation. Andererseits, um den gestiegenen Anforderungen der Anwender Rechnung zu tragen. (Klaus Meffert, Autor Java Magazin)






















Kommentare