JaCoCo ist das Herzstück von EclEmma und der Test/Code Coverage Berechnung durch Sonar.

EclEmma

EclEmma ist ein freies Java Code Coverage Eclipse Plugin.

Es erweitert Eclipse dahingehend, dass es einen weiteren Launch Mode (Debug, Run, …) gibt, der sich Coverage nennt.

Die wichtigsten Shortcuts für diese Launch Modes sind:

  • Alt + Shift + X, (Kürzel für das Artefakt) –> eXecute artifact (Ausführen eines Tests mit T oder eine Java Applikation mit J,…)
  • Alt + Shift + D, (Kürzel für das Artefakt) –> Debug artifact (Ausführen eines Tests mit T oder eine Java Applikation mit J,…)
  • Alt + Shift + E, (Kürzel für das Artefakt) –> coverage mit EclEmma (Ausführen eines Tests mit T oder eine Java Applikation mit J,…)

Wenn ich also meinen Test mit Alt-Shift+E,T ausführe, wird die Abdeckung aller Artefakte berechnet und in der Coverage View angezeigt.

Ein besonderer Effekt ist, dass die Abdeckung oder Nicht-Abdeckung meines Codes sofort farblich im Editor angezeigt wird:

EclEmmaCoverageEs werden alle vollständig durchlaufenen Zeilen in grün angezeigt.

Werden Zeilen (überhaupt) nicht durchlaufen, werden sie rot coloriert.

Die gelben Zeilen zeigen, dass es hier mehrere Zweige (Branches) gibt, die nicht erreicht wurden. Man kann durch die Anzeigen am Rand auch Tooltips erhalten wie: „4 of 8 branches missed.“.

Das Beispiel zeigt alle drei Colorierungen exemplarisch.
Diese Farben sind natürlich aus Barrierefreiheitsgründen konfigurierbar. Hierzu stellt man einfach unter General —> Editors —> Test Editors —> Annotations andere Farben ein:

EclEmma_Configuration_Coloring

EclEmma Coverage View

Die Coverage View ermöglicht nur die Ergebnisse etwas detaillierter anzuzeigen.

EclEmmaCoverageViewConfigurationDie Auswahlmöglichkeiten umfassen einerseits die sichtbaren Artefakte: Show Projects, Show Packages, …

Andererseits kann an dieser Stelle die Art des Reports angegeben werden.

 

 

 

Instruction (C0 Coverage) [sichtbar ohne Debug Information]

Diese View berechnet die Abdeckung durch das Mitzählen der Byte Code Instruktionen, die durchlaufen wurden. Das kann – muss aber nicht immer – der Line Coverage entsprechen. Hierzu gibt es auf der EclEmma Dokumentationsseite einen interessanten Hinweis:

“ Not all Java language constructs can be directly compiled to corresponding byte code.
In such cases the Java compiler creates so called synthetic code which sometimes results in unexpected code coverage results. “ (s. JaCoCo Coverage Counters)

Wenn man dies berücksichtigt, versteht man den folgenden Effekt:

StrangeCoverageSum

Jede Methode der Klasse hat die Testabdeckung 100%, die Klasse selbst jedoch 97,4%, weil eben ca. 30 von über 1000 Byte Code Instructions fehlten.

Branch (C1 Coverage) [sichtbar ohne Debug Information]

Die Branch Coverage zeigt uns den gleichen Wert an, wie die Condition Coverage in Sonar. Zum Vergleich seien hier zwei Screenshots gezeigt:

IntegrationTest_Coverage IntegrationTest_Condition_Coverage_Sonar

Line

Die Line Coverage kann nur für Klassen bestimmt und ordentlich berechnet werden, die mit Debug Informationen übersetzt wurden. Eine Code Zeile gilt hierbei als durchlaufen, wenn wenigstens eine Anweisung dieser Zeile ausgeführt wurde.

Normalerweise führt das Kompilieren einer Code Zeile zu mehreren Java Bytecode Instruktionen, was wiederumg dazu führen kann, dass eine mit 100% Coverage angegebene Codezeile in der farblichen Hinterlegung mit Geld versehen wird, weil nur ein Teil der Anweisungen durchgeführt wurde.

Die Instruction Coverage ist also etwas genauer als die Line Coverage.

Method

Die Methodenabdeckung wird berechnet und eine Methode als überdeckt angezeigt, wenn wenigstens eine Anweisung innerhalb der Methode aufgerufen wird. Hierbei werden statische Methoden genauso wie (implizite) Konstruktoren als Methoden gerechnet.

Type

Die Abdeckung eines Typs (hier repräsentiert durch eine Klasse) ist erfolgt, wenn wenigstens eine Methode dieses Typs aufgerufen wurde.

Complexity [sichtbar ohne Debug Information]

Die Komplexität wird berechnet durch die Anzahl durchlaufbarer Pfade (B) verkürzt um die Anzahl der Entscheidungspunkte (D):

complexity = B - D + 1