Komfortablere Java-Codeabdeckung mit Jacoco 0.8.0

JaCoCo (im Folgenden als jacoco bezeichnet) ist eine Java-Bibliothek, die C0 (Schritte) und C1 (Zweige) von Java abdeckt und darüber berichtet.

jacoco ist eine sehr nützliche Bibliothek, aber es gibt ein Problem mit einer Java-Syntax, die "eindeutig im Testcode übergeben wird, aber als Fehler in der Abdeckung behandelt wird". Mit dem kürzlich veröffentlichten Jacoco 0.8.0 wurden jedoch viele Probleme behoben.

Zusammenfassung

Hintergrund

Einige Java-Syntax und Java-Bytecode der Java-Syntax, die nach JDK7 eingeführt wurden, haben nicht erreichbare Routen, die nicht im Java-Quellcode ausgedrückt werden. Selbst wenn Sie einen Test schreiben, der eine 100% ige Abdeckung von C0 / C1 auf Java-Quellcodeebene erreichen kann, gab es daher ein Problem, dass die C0 / C1-Abdeckung aus irgendeinem Grund nicht 100% betragen konnte.

Mit jacoco 0.8.0 können Sie diese speziellen nicht erreichbaren Java-Bytecodes ausschließen und die Abdeckung von mehr Java-Quellcode richtig messen.

Ergänzung: Ich denke, die Gültigkeit einer 100% igen C0 / C1-Abdeckung ist umstritten. Es gibt jedoch die Realität, dass einige Entwicklungsarbeiten durch die Erfüllung dieses Index bezahlt werden. Daher ist es notwendig, einen Kompromiss zu schließen.

Java-Hauptsyntax wird von jacoco 0.8.0 unterstützt

Hier werde ich die Java-Syntax vorstellen, mit der die Abdeckung mit jacoco 0.8.0 ordnungsgemäß funktioniert. Von besonderer Bedeutung ist die Unterstützung der try-catch-resource-Klausel und der String switch-Anweisung.

1. try-catch-resource-Klausel

Die try-catch-resource-Klausel ist eine praktische Java-Syntax zum zuverlässigen und präzisen Schließen von Reader usw. In Versionen vor jacoco 0.8.0 war die Abdeckung nicht 100%, es sei denn, Sie haben eine "Ausnahme, die durch den Fang rutscht" ausgelöst, aber in jacoco 0.8.0 sind es 100%.

public static void printFileContents(String fileName) {
    try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
        System.out.println(br.toString());
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    //Ergänzung: 100 Deckung%Es ist auch notwendig, das "Pass Through" -Ausnahme-Auftrittsmuster auszuführen, um
}

Weitere Informationen finden Sie unter Problem Nr. 500.

2. String switch-Anweisung

Weitere Informationen finden Sie unter Problem Nr. 496.

Um beispielsweise die Abdeckung des folgenden Quellcodes abzudecken, beträgt die Abdeckung von C0 / C1 nicht 100%, selbst wenn die Eingabemuster von A, B, C und D überprüft werden. Diese Abdeckung beträgt 100% in Jacoco 0.8.0.

public static boolean stringSwitch(String s) {
    switch(s) {
        case "A": break;
        case "B": break;
        case "C": break;
        default: break;
    }
}

Unterstützung für Build / CI-bezogene Tools

Hier organisieren wir den Support-Status von "jacoco version 0.8.0" des von Gradle, Maven und Jenkins bereitgestellten jacoco-Plug-Ins. Verfügbar außer Jenkins.

Gradle Fazit: Jede Jacoco-Version verfügbar

Gradle stellt standardmäßig das Jacoco-Plug-In zur Verfügung, die standardmäßig verwendete Jacoco-Version ist jedoch etwas veraltet. Glücklicherweise können Sie die Jacoco-Version mit der Jacoco-Plug-In-Eigenschaft toolVersion angeben. Geben Sie also 0.8.0 an.

build.gradle(Auszug)


apply plugin: 'jacoco'
jacoco {
    toolVersion = "0.8.0"
}

Maven Fazit: Jede Jacoco-Version verfügbar

Es entspricht wie Gradle. Die offizielle Jacoco-Dokumentation enthält auch Informationen zum Jacoco-Plug-In für Maven. In Bezug auf Jacoco scheint die Maven-Seite die Hauptfamilie zu sein. http://www.eclemma.org/jacoco/trunk/doc/maven.html

pom.xml(Auszug)


<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.8.0</version>
</plugin>

Jenkins Fazit: Selbst mit der neuesten Version des Jacoco-Plug-Ins (v2.2.1) ist nur jacoco 0.7.5 verfügbar.

Das Jacoco-Plug-In von Jenkins scheint das letzte mit Version 2.0.0 und der auf Version 0.7.5 aktualisierten Jacoco-Version zu sein. Soweit Sie den Änderungsverlauf überprüfen können, wurde die Jacoco-Version zu diesem Zeitpunkt erst mit der neuesten Version 2.2.1 aktualisiert. Im Gegensatz zum Jacoco-Plug-In von Gradle können Sie die Version nicht angeben, sodass Sie den Quellcode ändern müssen.

Da das Master-Repository von GitHub auf jacoco 0.8.0 aktualisiert wurde, scheint es, dass jacoco 0.8.0 verwendet werden kann, indem ein Plug-In basierend auf dem Quellcode von GitHub erstellt wird.

https://github.com/jenkinsci/jacoco-plugin/blob/master/pom.xml

jacoco-plugin/pom.xml(Auszug)


<jacoco.version>0.8.0</jacoco.version>

(Bonus) In jacoco 0.8.0 eingeführte Filterklassen

Der Grund, warum viele Probleme mit der Java-Syntaxabdeckung seit jacoco 0.8.0 behoben wurden, ist das Hinzufügen filterbezogener Implementierungen von nicht erreichbarem Java-Bytecode. In diesem Jahr, 2017, hat Kommissar Godin einen Mechanismus eingeführt, um nicht erreichbaren Java-Bytecode in besonderen Fällen zu filtern, damit die C0 / C1-Abdeckung auf Quellcode-Ebene normal beurteilt werden kann.

Mit der Einführung dieser filterbezogenen Klasse ist es möglich geworden, Java-Bytecode-Routen, die "auf Java-Quellcode-Ebene nicht erreichbar" sind, von Fall zu Fall zu filtern, und es ist möglich geworden, Bereiche auszuschließen, die nicht als Abdeckung gezählt werden müssen. Vielleicht werden wir weiterhin Filterklassen hinzufügen, um Fälle zu behandeln, in denen die Abdeckung nicht normal durchgeführt werden kann.

Filterbezogene Klassendateien befinden sich im folgenden Verzeichnis auf GitHub. org.jacoco.core.internal.analysis.filter

Recommended Posts

Komfortablere Java-Codeabdeckung mit Jacoco 0.8.0
[JaCoCo (Java Code Coverage)] Verwendung mit NetBeans
Lassen Sie uns migrieren, um Java komfortabler zu machen
Bequemer Download mit JAVA
Erstellen Sie Java mit Mac vs Code
Führen Sie gepackten Java-Code mit Befehlen aus
Bereiten Sie die Java-Entwicklungsumgebung mit VS Code vor
Verknüpfen Sie Java- und C ++ - Code mit SWIG
Machen Sie so etwas wie Javas Enum mit Typescript
[Java] Machen Sie das Programm mit parallelStream 10x schneller
Führen Sie Java-Code von cpp auf cocos2dx aus
Machen Sie die SpringBoot1.5 + Gradle4.4 + Java8 + Docker-Umgebung mit Java11 kompatibel
Führen Sie eine statische Code-Analyse mit Checkstyle mit Java + Gradle durch
Machen Sie Java Stream Zeilenumbrüche mit Eclipse schön
Erstellen Sie mit Gradle mit VSCode Java → Ausführen
Einfacher LINE BOT mit Java Servlet
Versuchen Sie, ein Java-Programm mit VS-Code zu debuggen
Erstellen Sie eine Java-Entwicklungsumgebung mit VS Code
Führen Sie Java-Code skriptweise aus
Java-Code-TIPPS
Java-Beispielcode 02
Java-Beispielcode 03
Java-Beispielcode 04
Java-Beispielcode 01
Java-Zeichencode
Erstellen Sie eine Java-Entwicklungsumgebung mit VS Code auf dem Mac
Erste Schritte mit Java-Programmen mit Visual Studio Code
Machen Sie mit JavaFX erstellte Kalender-Gadgets mit Java SE 9 kompatibel
Warum können Sie Java mit Visual Studio Code entwickeln?
So erstellen Sie eine Java-Entwicklungsumgebung mit VS Code
Überprüfen Sie die Abdeckung mit Codecov in der Java + Gradle + Wercker-Konfiguration
Erstellen Sie eine Java-Programmentwicklungsumgebung mit Visual Studio Code
Ich habe nc (netcat) normalerweise mit JAVA gemacht