Couverture de code Java plus confortable avec Jacoco 0.8.0

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.

Résumé

Contexte

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.

Syntaxe Java principale prise en charge par jacoco 0.8.0

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.

1. Clause try-catch-resource

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.

2. Instruction de changement de chaîne

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

Prise en charge des outils liés à la construction / CI

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>

(Bonus) Filtrage des classes liées introduites dans jacoco 0.8.0

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

Couverture de code Java plus confortable avec Jacoco 0.8.0
[JaCoCo (Java Code Coverage)] Utilisation avec NetBeans
Migrons pour rendre Java plus confortable
Téléchargement confortable avec JAVA
Construire Java avec Mac vs Code
Exécuter du code Java packagé avec des commandes
Préparer l'environnement de développement Java avec VS Code
Lier le code Java et C ++ avec SWIG
Créez quelque chose comme Enum de Java avec Typescript
[Java] Rendez le programme 10 fois plus rapide avec parallelStream
Exécutez du code Java à partir de cpp sur cocos2dx
Rendre l'environnement SpringBoot1.5 + Gradle4.4 + Java8 + Docker compatible avec Java11
Analyse de code statique par Checkstyle avec Java + Gradle
Rendre la ligne Java Stream agréable avec Eclipse
En utilisant Gradle avec VSCode, compilez Java → exécutez
Facile à créer LINE BOT avec Java Servlet
Essayez de déboguer un programme Java avec VS Code
Créer un environnement de développement Java avec VS Code
Exécuter du code Java de manière scriptée
CONSEILS relatifs au code Java
Exemple de code Java 02
Exemple de code Java 03
Exemple de code Java 04
Exemple de code Java 01
Code de caractère Java
Créer un environnement de développement Java avec VS Code sur Mac
Prise en main des programmes Java à l'aide de Visual Studio Code
Rendre les gadgets de calendrier créés avec JavaFX compatibles avec Java SE 9
Pourquoi pouvez-vous développer Java avec Visual Studio Code?
Comment créer un environnement de développement Java avec VS Code
Vérifiez la couverture avec Codecov dans la configuration Java + Gradle + Wercker
Créer un environnement de développement de programme Java avec Visual Studio Code
J'avais l'habitude de faire nc (netcat) avec JAVA normalement