
Mit der Basismetrik Zeile für Zeile zu besseren Ergebnissen
Java-Testabdeckung Teil 2: Line Coverage
Von: Sven Ruppert
In dieser Reihe von Blogbeiträgen werden wir uns eingehend mit den verschiedenen Aspekten der Testabdeckung befassen und verschiedene Techniken und Tools untersuchen, die Entwicklern dabei helfen, qualitativ hochwertige Software zu erstellen. In diesem Beitrag untersuchen wir die zeilenbasierte Testabdeckung.
Die Zeilenabdeckung
Die Zeilenabdeckung ist eine Code-Abdeckungsmetrik, die misst, ob jede Zeile Quellcode eines Programms während des Tests ausgeführt wurde. Auch in Java zeigt die Zeilenabdeckung uns Entwicklern, wie gründlich unsere Tests den Code ausführen, indem sie angibt, welche Zeilen getestet wurden und welche nicht. Wir wollen uns die Zeilenabdeckung anhand von Java genauer ansehen.
Schlüsselkonzepte der Zeilenabdeckung
Definition
Die Zeilenabdeckung misst, ob jede Codezeile während des Tests mindestens einmal ausgeführt wurde.
Bedeutung
Fehlererkennung: Hilft bei der Identifizierung ungetesteter Teile des Codes, die möglicherweise Fehler enthalten.
Codequalität: Stellt sicher, dass alle Teile des Codes getestet werden, was zu einer insgesamt besseren Codequalität führt.
Wartung: Hilft bei der Pflege des Codes, indem sichergestellt wird, dass Änderungen und neue Ergänzungen getestet werden.
Tools zum Messen der Zeilenabdeckung in Java
JaCoCo (Java-Code-Abdeckung): Eine weit verbreitete Open-Source-Bibliothek zur Messung der Codeabdeckung in Java-Projekten.
Emma: Ein weiteres beliebtes Tool, das jedoch größtenteils von JaCoCo abgelöst wurde.
Cobertura: Ein älteres Code-Coverage-Tool, das in einigen Projekten immer noch verwendet wird.
EclEmma: Ein Eclipse-Plugin für JaCoCo, das die Visualisierung der Berichterstattung direkt in der IDE vereinfacht.
So funktioniert Zeilenabdeckung
Tools wie JaCoCo instrumentieren den Bytecode eines Java-Programms, um an verschiedenen Stellen Sonden einzufügen. Diese sammeln Daten darüber, welche Codezeilen während des Testlaufs ausgeführt werden. Sobald der Code instrumentiert ist, werden die Tests ausgeführt. Während die Tests ausgeführt werden, sammeln die Sonden unterschiedliche Ausführungsdaten für jede Codezeile. Nach Abschluss eines Tests generiert das Coverage-Tool einen Bericht, der zeigt, welche Codezeilen ausgeführt wurden. Dieser Bericht enthält häufig visuelle Indikatoren (z. B. Farbcodierung), um abgedeckte (ausgeführte) und nicht abgedeckte (nicht ausgeführte) Linien hervorzuheben.
Beispiel-Workflow mit JaCoCo
Für ein Maven-Projekt fügen wir das JaCoCo-Plugin zur Datei `pom.xml` hinzu:
```xml
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.8</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
```
- Führe die Tests mit Maven aus: `mvn clean test`
- Generiere nach dem Ausführen der Tests den Abdeckungsbericht: `mvn jacoco:bericht`
Der Bericht wird normalerweise im Verzeichnis `target/site/jacoco` generiert. Um den detaillierten Abdeckungsbericht anzuzeigen, öffne die Datei `index.html` in einem Webbrowser.
Berichte zur Zeilenabdeckung interpretieren
Der Abdeckungsprozentsatz beschreibt den Anteil der ausgeführten Zeilen an der Gesamtzahl der Zeilen. Normalerweise weist eine grüne Hervorhebung auf abgedeckte Zeilen hin, während nicht abgedeckte Zeilen rot hervorgehoben werden. Berichte können zusätzliche Messwerte wie die Anzahl der abgedeckten und verpassten Zeilen, Verzweigungen und Methoden enthalten.
Empfohlene Vorgehensweise
Du solltest nach der größtmöglichen Abdeckung für dein Projekt streben, um die maximale Zuverlässigkeit deines Codes zu gewährleisten – eine hundertprozentige Abdeckung ist ideal. Stelle vor allem sicher, dass die kritischsten und komplexesten Teile deines Codes umfassend abgedeckt sind. Im Rahmen deiner CI/CD-Pipeline solltest du regelmäßig Abdeckungsberichte ausführen, um Regressionen zu erkennen und sicherzustellen, dass neuer Code ausreichend getestet wird. Die Zeilenabdeckung ist nur ein Aspekt des Testens. Für eine umfassende Abdeckung benötigst du zusätzliche Techniken wie Unit-, Integrations- und manuelle Tests.
Einschränkungen
Eine hohe Zeilenabdeckung garantiert noch nicht das Erkennen von Fehlern. Es ist möglich, dass Tests alle Zeilen abdecken, dabei die Logik jedoch nicht effektiv testen. Das bloße Streben nach hohen Abdeckungszahlen kann dazu führen, dass oberflächliche Tests geschrieben werden, die das Verhalten des Codes nicht gründlich validieren.
Die Zeilenabdeckung ist eine wertvolle Metrik zur Beurteilung der Gründlichkeit deiner Tests in Java-Projekten. Die Verwendung von Tools wie JaCoCo und die Befolgung von Best-Practices stellen sicher, dass dein Code gut getestet ist und hohe Qualitätsstandards einhält. Die Zeilenabdeckung sollte jedoch immer als Teil einer umfassenderen Teststrategie verwendet werden, um die besten Ergebnisse zu erzielen.

Über den Autor: Sven Ruppert
Sven programmiert seit 1996 Java in Industrieprojekten, seit über 15 Jahren weltweit Java in Branchen wie Automobil, Raumfahrt, Versicherungen, Banken, der UNO und der Weltbank. Seit zehn Jahren ist er als Sprecher auf Konferenzen und Community-Events in Ländern von Amerika bis Neuseeland. Er hat als Developer Advocate für JFrog und Vaadin gearbeitet und schreibt regelmäßig Artikel für IT-Magazine und Technologieportale.