JaCoCo (ci-après dénommée jacoco) est une bibliothèque Java qui couvre et rend compte de C0 (étapes) et C1 (branches) de Java.
jacoco est une bibliothèque très utile, mais il y a un problème avec une certaine syntaxe Java qui "passe clairement dans le code de test, mais elle est traitée comme une erreur de couverture". Cependant, avec le jacoco 0.8.0 récemment publié, de nombreux problèmes ont été résolus.
Certaines syntaxes Java et certains codes d'octets Java de la syntaxe Java introduits après JDK7 ont des routes inaccessibles qui ne sont pas exprimées dans le code source Java. Pour cette raison, même si vous écrivez un test qui peut atteindre une couverture de 100% de C0 / C1 au niveau du code source Java, il y avait un problème que la couverture C0 / C1 ne pouvait pas être de 100% pour une raison quelconque.
jacoco 0.8.0 vous permet d'exclure ces codes d'octets Java inaccessibles spéciaux et de mesurer correctement la couverture de plus de code source Java.
Supplément: Je pense que la validité d'une couverture à 100% C0 / C1 est controversée. Cependant, dans certains travaux de développement, il y a une réalité que vous gagnez de l'argent en satisfaisant cet indice, il est donc nécessaire de faire un compromis autour de cela.
Ici, je vais vous présenter la syntaxe Java qui permet à la couverture de fonctionner correctement avec jacoco 0.8.0. La prise en charge de la clause try-catch-resource et de l'instruction String switch est particulièrement importante.
La clause try-catch-resource est une syntaxe Java pratique pour fermer Reader, etc. de manière fiable et concise. Dans les versions antérieures à jacoco 0.8.0, la couverture n'était pas de 100% à moins que vous n'ayez levé une "exception qui glisse par catch", mais dans jacoco 0.8.0, elle est de 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();
}
//Supplément: 100 couvertures%Il est également nécessaire d'exécuter le modèle d'occurrence d'exception «passer par» pour
}
Voir Issue # 500 pour plus de détails.
Voir Issue # 496 pour plus de détails.
Par exemple, afin de couvrir la couverture du code source suivant, la couverture de C0 / C1 n'est pas de 100% même si les modèles d'entrée de A, B, C et D sont vérifiés. Cette couverture est de 100% en jacoco 0.8.0.
public static boolean stringSwitch(String s) {
switch(s) {
case "A": break;
case "B": break;
case "C": break;
default: break;
}
}
Ici, nous allons organiser le statut de support de "jacoco version 0.8.0" du plug-in jacoco fourni par Gradle, Maven et Jenkins. Disponible sauf pour Jenkins.
Gradle Conclusion: toute version jacoco disponible
Gradle fournit le plug-in jacoco par défaut, mais la version jacoco utilisée par défaut est un peu obsolète. Heureusement, vous pouvez spécifier la version jacoco avec la propriété du plug-in jacoco toolVersion
, spécifions donc 0.8.0.
build.gradle(Extrait)
apply plugin: 'jacoco'
jacoco {
toolVersion = "0.8.0"
}
Maven Conclusion: toute version jacoco disponible
Cela correspond comme Gradle. La documentation officielle de jacoco contient également des informations sur le plug-in jacoco pour Maven. En termes de jacoco, le côté Maven semble être le chef de famille. http://www.eclemma.org/jacoco/trunk/doc/maven.html
pom.xml(Extrait)
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.0</version>
</plugin>
Jenkins Conclusion: seul jacoco 0.7.5 est disponible même avec la dernière version du plug-in jacoco (v2.2.1)
Il semble que le dernier plug-in jacoco de Jenkins était v2.0.0 et la version jacoco a été mise à jour vers la v0.7.5. Pour autant que vous puissiez vérifier l'historique des modifications, la version jacoco n'a pas été mise à jour avant la dernière version 2.2.1 pour le moment. En particulier, contrairement au plug-in jacoco de Gradle, vous ne pouvez pas spécifier la version, vous devez donc modifier le code source.
De plus, depuis que le référentiel maître de GitHub a été mis à jour vers jacoco 0.8.0, il semble que jacoco 0.8.0 puisse être utilisé en construisant un plug-in basé sur le code source de GitHub.
https://github.com/jenkinsci/jacoco-plugin/blob/master/pom.xml
jacoco-plugin/pom.xml(Extrait)
<jacoco.version>0.8.0</jacoco.version>
La raison pour laquelle de nombreux problèmes de couverture de la syntaxe Java ont été résolus depuis jacoco 0.8.0 est l'ajout d'implémentations liées au filtrage de code d'octet Java inaccessible. Cette année, en 2017, le commissaire Godin a introduit un mécanisme pour filtrer le code d'octet Java inaccessible dans des cas particuliers, de sorte que la couverture C0 / C1 au niveau du code source puisse être jugée normalement.
Avec l'introduction de cette classe liée au filtrage, il est devenu possible de filtrer les routes de code d'octet Java qui ne sont «pas accessibles au niveau du code source Java» au cas par cas, et il est devenu possible d'exclure des zones qui n'ont pas besoin d'être comptées comme couverture. Peut-être continuerons-nous à ajouter des classes liées au filtrage pour gérer les cas où la couverture échoue.
Les fichiers de classe liés aux filtres se trouvent dans le répertoire suivant sur GitHub. org.jacoco.core.internal.analysis.filter
Recommended Posts