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.
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.
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
.
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.
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;
}
}
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>
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