Software Engineering

JaCoCo Jambo! – Part 2

Integration von JaCoCo

Im ersten Teil über JaCoCo habe ich versprochen, dass das Java Code Coverage Tool ohne großen Aufwand in die Testlandschaft einzubinden sei. Dieses Versprechen werde ich nun einlösen und zeige an dieser Stelle den einfachsten und schnellsten Weg um JaCoCo einsetzen zu können – Maven! Das Plugin lässt sich hiermit einbinden:

Abschließend müssen die Goals für das Maven-Plugin deklariert werden. Hierbei können die Reports in ein Default Verzeichnis als auch in ein beliebiges Verzeichnis gespeichert werden.

Default Verzeichnis

Wird kein Pfad zur Erstellung eingegeben, so sind die Reports ausgehend vom Projektverzeichnis unter /target/site/jacoco zu finden. Die notwendigen Goals umfassen prepare-agent um den Java Agent zu initialisieren sowie report für die Generierung des Reports:

Beliebiges Verzeichnis

Möchte man einen eigenen Pfad für die Reports definieren, so muss bei der Report-Execution in der POM das Output-Verzeichnis angegeben werden. Die Reports werden ausgehend von der jacoco-unit.exec Datei generiert. In der outputDirectory ist das Verzeichnis angegeben, in welchem die Reports hinterlegt werden sollen.

 

Die Ausnahme: Ausnahmen

slippery-wet-caution

JaCoCo ist in seinem Umfang jedoch eingeschränkt. Deutlich sichtbar wird dies beim Exception Handling. Mit einem weiteren Beispiel lässt sich die Problematik besser erläutern:

Das Prinzip der Klasse ist simpel. Der Aufrufparameter soll den Namen des Unternehmens darstellen. Wenn der Name „Oracle“ ist, so wird „Oracle ACE“ ausgegeben. Falls der Name nicht Oracle ist, wird eine Methode aufgerufen, welche eine IllegalArgumentException wirft. Die Tests dazu sehen wie folgt aus:

Ausgehend von der ACE Klasse könnte man von diesen beiden Tests nun ausgehen, dass die Klasse zu 100% abgedeckt sein sollte. JaCoCo funktioniert hier jedoch etwas anders als intuitiv erwartet und erstellt folgenden Report:

image2015-4-23 15_45_18

Was ist hier geschehen? Der erste Test verlief wie gewünscht, die return Anweisung wurde erreicht. Der zweite Test jedoch kommt nicht zum terminieren. Das Programm springt in die Methode und kommt nicht mehr heraus – sobald ein Fehler geworfen wurde ist jeglicher darauf folgender Code unerreichbar. Demnach lässt sich keine 100%ige Testabdeckung erreichen.

Dies lässt sich damit begründen, dass nach dem Auswurf des Fehlers die Methode im IF Block nicht terminiert sondern aufgrund der Fehlermeldung abrupt abbricht. Dadurch ist die Methode nicht abgeschlossen und wird nicht als vollständig ausgeführt deklariert. Die Anweisung wurde zwar getriggert, jedoch wurde der Block nie verlassen, weil der Kontrollfluss bereits in der inneren Methode abbrach und die Methode somit „unnatürlich“ verlassen wurde. In Fällen wie diesen ist es ratsam die Exception bereits an der Stelle zu feuern, an welchen sie auftreten können.

Alternative Tools

toolset

Sofern man seine Tests sorgfältig erstellt und auf die eingegangenen Eigenheiten von JaCoCo achtet, ist es ein überaus hilfreiches Werkzeug um die Codequalität zu verbessern und mögliche Schwachstellen aufzudecken. JaCoCo ist jedoch nicht das einzige Werkzeug am Horizont, welches dem Entwickler eine Stütze sein kann. Es existiert eine breite Palette an kostenfreien Tools auf dem Markt, welche ebenfalls ihre Existenzberechtigung haben:

▪ Arquillian JaCoCo Extension (http://arquillian.org/modules/jacoco-extension/)
▪ Clover (lizenzfrei für OSS Projekte) (https://www.atlassian.com/software/clover)
▪ Cobertura (http://cobertura.sourceforge.net/)
▪ CodeCover (http://www.codecover.org)
▪ Coverlipse (Eclipse-Plugin) (http://coverlipse.sourceforge.net/)
▪ EMMA (http://emma.sourceforge.net/)
▪ GroboCodeCoverage (http://groboutils.sourceforge.net)
▪ Hansel (Quellcode z.T. von Gretel) (http://hansel.sourceforge.net)
▪ InsECT (http://insectj.sourceforge.net/)
▪ JCov (https://wiki.openjdk.java.net/display/CodeTools/jcov)
▪ Jester (http://jester.sourceforge.net/)
▪ NoUnit (http://nounit.sourceforge.net)
▪ PIT (http://pitest.org)
▪ Quilt (http://quilt.sourceforge.net/)
▪ Serenity (https://wiki.jenkins-ci.org/display/JENKINS/Serenity+Plugin)
▪ Sonarqube (ehemals Sonar) (http://www.sonarqube.org/)

Fakt ist: man sollte sich selbst eine Meinung über JaCoCo bilden. Meines Erachtens nach ist es ein sehr nützliches und wichtiges Werkzeug im Daily Development und man sollte es unbedingt im eigenen Projekt zumindest getestet haben.
Ist man sich erst bewusst geworden was JaCoCo an Mehrwert bringt, beginnt man den Tag mit einem herzlichen „JaCoCo Jambo*!“.

(* = Jambo bedeutet „Hallo“ auf Swahili)

Weitere Informationen

> JaCoCo Jambo – eine Einleitung