Manchmal ist es wirklich eine Hassliebe: dieser Drang nach Perfektion wenn es darum geht den sorgsam geschriebenen Code zu testen. Einigen mag es vielleicht als eine lästige alltägliche Bürde erscheinen, aber andererseits gibt es auch Menschen, welche den Mehrwert dieser Tätigkeit wirklich zu schätzen wissen. Als Entwickler erfüllt es mich schon etwas mit Stolz und Zufriedenheit, wenn grüne Balken der Unit Tests meinen Bildschirm füllen und mir signalisieren, dass meine Tests wie erwartet verlaufen sind.

Doch wie kann ich mir sicher sein, dass ich auch alles Wichtige in meinen Tests berücksichtigt habe? Habe ich auch wirklich an alles gedacht, bin ich jede mögliche Situation durchgegangen und habe ich demnach „richtig“ getestet? Um sich in solchen Fragen Sicherheit zu verschaffen ist der Einsatz von Code Coverage Tools zur Testabdeckung mittlerweile im Repertoire eines jeden guten Entwicklers. Unter den guten und kostenfreien Tools im Java-Umfeld ist oft auf JaCoCo anzutreffen. Der Name erinnert an einen Hit aus den 90ern, steht jedoch stellvertretend für Java Code Coverage und ist ein vielseitiges Tool zur Testabdeckung.

Was ist JaCoCo?

JaCoCo bietet dem Entwickler die Möglichkeit die erreichte Abdeckung der Testfälle zu ermessen und entsprechend Reports dieser Tests in unterschiedlichen Formaten zu erstellen.

Die Reports können als XML, HTML oder sogar als CSV eingesehen werden. Unter der Nutzung des Tool Interface der Java Virtual Machine instrumentalisiert JaCoCo über einen Java Agent die .class Dateien zur Laufzeit. Dies ermöglicht dem schicken Tool die Einsicht in die aufgerufenen Klassen und Zeilen zur Laufzeit des Tests und die Fertigstellung des Reports – per Default nach der Terminierung der Testfälle. Der Clou an der Sache: da die Instrumentalisierung auf Bytecode-Ebene vonstatten geht, ist JaCoCo in seiner Ausführung auch relativ schnell.

Hierbei wird die Abdeckung von

  • Anweisungen
  • Verzweigungen
  • Zeilen
  • Methoden sowie
  • Klassen bzw. die Komplexität

geprüft und aufgezeichnet.

Als Beispiel soll eine simple Applikation dienen, deren Report im HTML Format hier aufgeführt ist. Die Applikation jacocotest hat nur ein Package – und aus dem Bericht wird ersichtlich, dass dort wohl etwas nicht stimmt.

Paketebene

image2015-3-18 18_59_51
Bereits an dieser Darstellung ist zu sehen, dass eine Methode nicht ausreichend getestet wurde (97%) und eine von zwei Abzweigungen nicht geprüft wurden. Ferner ist hier ersichtlich, wie viele Zeilen insgesamt von JaCoCo genauer inspiziert wurden, sowie die Anzahl der Methoden und Klassen, welche innerhalb des Package geprüft wurden.

Klassenebene

image2015-3-18 19_2_0
Alle Klassen des gewählten Package sind hier aufgeführt. Der Coding-Fauxpas liegt hier in der Consultant-Klasse. Blicken wir doch mal einen Blick hinein:

Methodenebene

image2015-3-18 19_2_51
Die getesteten Methoden und deren Abdeckungsgrad sind hier ersichtlich. Beachtet hier, dass ihr jederzeit über die obere Zeile des HTML Dokumentes in der Reportstruktur springen kann. Der in der Tabelle als Cxty dargestellter Parameter gibt Aufschluss über die Komplexität der Methoden, mit anderen Worten: die (lineare) Anzahl an möglichen Pfaden, um die Methode zu durchlaufen. JaCoCo zeigt jedoch nicht nur die fehlerhaft getesteten Methoden sondern setzt noch einen drauf:

Quellcode-Ebene

image2015-3-18 19_6_46
Die tiefste Ebene des HTML Report zeigt den Quellcode der Klasse, alle getesteten Methoden sowie deren Testergebnis auf einer Farbskala an. Grüne Zeilen sind getestete Methoden, rote Zeilen geben Aufschluss, dass diese Zeile im Testfall nicht erreicht wurde. Gelbe Zeilen hingegen (im oberen Bild als gelber Diamant dargestellt) zeigen auf, dass die Anweisung nicht vollständig durchlaufen wurde. Ein Mouseover über den Diamanten gibt den Grund für die „Unvollständigkeit“ preis.

Diese Demonstration hat vermutlich bei einigen nun den Drang erweckt, das Tool selbst auszuprobieren und einzusetzen. Die Integration in das Projekt ist spielend einfach und werde ich im zweiten Teil näher erläutern.

Weitere Informationen

> JaCoCo Jambo! – Part 2