Continuous Testing Tools (nicht nur) für Java – Infinitest vs. JUnitMax

Keine Kommentare

Tools wie Infinitest und JUnit Max führen Java Unit-Tests zum frühestmöglichen Zeitpunkt aus, nämlich direkt nachdem eine relevante Codeänderung stattgefunden hat. So erhält man sehr schnell Feedback, und Fehler bzw. deren Ursachen werden schneller erkannt. Gerade bei testgetriebener Entwicklung (TDD) erspart einem dies auch das andauernde manuelle Ausführen der Testfälle. Zudem werden die Tests derart in Reihenfolge gebracht, dass solche mit höchster Fehlerwahrscheinlichkeit zuerst ausgeführt werden.

Infinitest

Zwischenzeitlich wurde Infinitest kommerziell vertrieben und auch jetzt landet man bei einer Google Suche i. d. R. noch als Erstes auf einer Seite, auf der man Infinitest käuflich erwerben kann. Seit November 2010 wird es jedoch als Open Source Projekt bei github gehostet und steht mittlerweile unter der GPLv3-Lizenz. Während die Vorgängerversion 4 noch IDE-neutral mit einer Swing-GUI daherkam, integriert Infinitest sich nun als Plugin in Eclipse (Update Site: http://infinitest.github.com) und IntelliJ. Das aktuelle stable Release (5.1.84) unterstützt JUnit, experimenteller Support für TestNG ist erst seit Januar 2011 im Git-Repository enthalten.

Das Eclipse-Plugin zeigt den globalen Zustand als grün/gelb/rot gefärbten Balken in der Statusleiste an. Die Tests verlaufen kontinuierlich im Hintergrund und erzeugen visuelle Hinweise, stören aber sonst den Entwicklungsfluss nicht. Die Testergebnisse werden wie Compile-Fehler direkt an der betroffenen Codezeile sowie im Problems-View aufgelistet. Wenn ein Fehler in Form einer Exception innerhalb des getesteten Codes auftritt, kann man sich über einen Quick-Fix den dazugehörigen Stacktrace anzeigen lassen und darüber zum aufrufenden Test springen.

Mit minimalen Einstellmöglichkeiten in der GUI kommt das Eclipse Plugin geradezu „lean“ daher. Tatsächlich werden die wesentlichen Konfigurationseinstellungen wie im User Guide beschrieben teamfreundlich über die Dateien infinitest.filters und infinitest.args vorgenommen und können unter Versionskontrolle stehen. Hierüber lassen sich länger laufende bzw. Non-Unit Tests dauerhaft ausschließen und spezielle VM-Einstellungen wie z. B. größerer Heap-Speicher konfigurieren.

Insgesamt wirkt Infinitest recht ausgereift und scheint auch mit größeren Workspaces kein Problem zu haben. Interessant zu lesen ist hierzu auch der Blog-Eintrag zu Infinitest von Alex Ruiz.

Da die Tests auf Basis von Class Files agieren, besteht die Chance, dass zukünftig auch alternative Sprachen wie Groovy oder Scala unterstützt werden. Versuchsweise habe ich mal Groovy Unit Tests erstellt. Diese wurden ebenfalls erkannt, die Fehlermeldung konnte aber keiner Codezeile zugeordnet werden. Außerdem „hing“ die Testfallausführung hier bis zu einer Minute. Die Ausführung von Scala-Tests soll hingegen funktionieren.

JUnit Max

JUnit Max wurde als Eclipse Plugin von Kent Beck entwickelt und ist per Subscription für 100$ pro Entwickler und Jahr unter kommerzieller Lizenz zu haben. Wie Name und Autor schon vermuten lassen, wird nur JUnit unterstützt, TestNG Nutzer bleiben außen vor.

Von der Funktionalität her unterscheidet sich JUnit Max (aktuell in Version 1.2.22) kaum von Infinitest. Auch hier findet sich eine Ampel in der Statusleiste und Fehler werden an den jeweiligen Codezeilen und im Problems-View vermerkt. Darüber hinaus besteht jedoch die Möglichkeit, Codeänderungen, die seit dem den letzten „grünen“ Stand durchgeführt wurden, wieder rückgängig zu machen.

Die Einstellmöglichkeiten per UI sind umfangreicher als bei Infinitest. Der Entwickler kann auf Projekt- und Package-Ebene entscheiden, ob kontinuierliches Testen gewünscht ist. Leider werden die Einstellungen Eclipse-intern und nicht in Projektdateien gespeichert, so dass entsprechende Einstellungen bei jedem Entwickler erneut vorgenommen werden müssen.

Alternative Programmiersprachen werden von JUnit Max nicht unterstützt. Entsprechende Tests wurden bei mir generell ignoriert. Ebenso wurden bspw. Änderungen an Groovy-Klassen nicht erkannt, selbst wenn sie von Java-Tests abgedeckt wurden.

Leider verweigerte das Plugin bei mir nach kurzer Zeit mit einer EOFException auf der Konsole seinen Dienst, bis Eclipse jeweils neu gestartet wurde. Das scheint jedoch nur ein lokales Problem zu sein, das bei Kollegen nicht auftritt.

Was gibt es noch zu sagen

Abschließend ist noch zu erwähnen, dass keines der Tools das explizite Ausführen der Tests vor einem Check-In überflüssig machen kann, selbst wenn keine Filter auf den Tests definiert sind. Es gibt Fälle, in denen die Erkennung betroffener Testfälle an ihre Grenzen stößt, z. B. wenn wenn Reflection verwendet wird.

Beide Tools verbessern die Produktivität insbesondere bei testgetriebener Java-Entwicklung, mein persönlicher Favorit ist jedoch Infinitest, insbesondere wegen der versionierbaren und flexibleren Filtermöglichkeiten.

Autor

Carsten Mjartan

Share on FacebookGoogle+Share on LinkedInTweet about this on TwitterShare on RedditDigg thisShare on StumbleUpon

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *