web-dev-qa-db-fra.com

Jacoco ne montre pas les fichiers source du rapport de couverture HTML pour les multiples projets

J'utilise PDE et dans ma build.xml, je compile mon code et j'essaie de créer un rapport de couverture à l'aide de Jacoco et Junit. J'ai remarqué que cela montrent maintenant le fichier source, même si j'ai ajouté sourcefiles section dans la section structure de jacoco:report. Afin de le déboguer (car il n'imprime aucune erreur), j'ai essayé de l'exécuter localement :

Java -jar jacoco/jacococli.jar report /buildFiles/coverage/jacoco.exec --classfiles /buildFiles/plugins/com.gandu.da.util.test/bin/com/gandu/da/util/test/AllTests.class --sourcefiles /buildFiles/plugins/com.gandu.da.util.test/src/com/gandu/da/util/test/AllTests.Java --html html_report

Mais cela ne montre toujours pas le code Sourcecode dans le fichier HTML. Dans la FAQ officiel Jacoco Je vois:

Pourquoi le rapport de couverture ne montre-t-il pas de code source en surbrillance? Assurez-vous que les prérequis suivants sont remplis pour obtenir un code source en surbrillance dans les rapports de couverture Jacoco:

  • Les fichiers de classe doivent être compilés avec des informations de débogage pour contenir des numéros de ligne.
  • Les fichiers source doivent être correctement fournis lors de la génération de rapports. C'est à dire. Les dossiers de source spécifiés doivent être le parent direct des dossiers qui définissent le Java packages.

J'ai compilé le code avec -g Drapeau pour obtenir toutes les informations - cela n'a pas fonctionné. De plus, je crois que je fournis les fichiers SRC/bin comme prévu, donc je ne sais pas pourquoi cela ne fonctionne pas. Comment le faire fonctionner?

[~ # ~] Edit [~ # ~] : Je devais fournir le répertoire src:

Java -jar jacoco/jacococli.jar report /buildFiles/coverage/jacoco.exec --classfiles /buildFiles/plugins/com.gandu.da.util.test/bin/com/gandu/da/util/test/AllTests.class --sourcefiles /buildFiles/plugins/com.gandu.da.util.test/src
# WORKED!

Maintenant, je veux résoudre le problème avec mon build.xml. Le code:

<jacoco:report>
    <executiondata>
        <file file="${coverage.file}"/>
    </executiondata>
    <structure name="Coverage Report">
        <classfiles>
            <fileset dir="${buildDirectory}/plugins/com.gandu.da.util.test/bin">
                <include name="**/*.class" />
            </fileset>
        </classfiles>
        <sourcefiles encoding="UTF-8">
            <fileset dir="${buildDirectory}/plugins/com.gandu.da.util.test/src">
                <include name="**/*.Java" />
            </fileset>
        </sourcefiles>
    </structure>
    
    <html destdir="${coverage.html}"/>
</jacoco:report>

Ce code a fonctionné et a fourni le rapport de couverture avec les fichiers source . Mais comme vous pouvez le voir, je n'avais qu'un seul paquet (com.gandu.da.util.test). Je souhaite créer un rapport de couverture de tous les packages qui:

  • sRC: ${buildDirectory}/plugins/com.gandu*/src.
  • poubelle: ${buildDirectory}/plugins/com.gandu*/bin.

Alors j'ai essayé:

<jacoco:report>
    <executiondata>
        <file file="${coverage.file}"/>
    </executiondata>
    <structure name="Coverage Report">
        <classfiles>
            <fileset dir="${buildDirectory}/plugins/com.gandu.*/bin">
                <include name="**/*.class" />
            </fileset>
        </classfiles>
        <sourcefiles encoding="UTF-8">
            <fileset dir="${buildDirectory}/plugins/com.gandu.*/src">
                <include name="**/*.Java" />
            </fileset>
        </sourcefiles>
    </structure>
    
    <html destdir="${coverage.html}"/>
</jacoco:report>

Mais cela n'a pas fonctionné parce que le chemin (avec l'étoile) n'existe pas. Cela a du sens parce que dir vous attend d'avoir un chemin. J'ai donc compris que <foreach> Peut aider ici, mais après avoir lu le Docs , je ne pouvais pas comprendre un moyen de l'utiliser. Le code ci-dessus est ce dont j'ai besoin. J'espère entendre une suggestion sur la façon de résoudre ce problème.

Une note de plus puisque elle est importante: la structure des fichiers source et de classe:

  • les fichiers source sont situés sous ${buildDirectory}/plugins/com.gandu*/src.
  • les fichiers de classe sont situés sous: ${buildDirectory}/plugins/com.gandu*/bin.

J'ai aussi essayé d'insérer ${buildDirectory}/plugins dans dir des deux <classfiles> et <sourcefiles> Mais cela n'a pas fonctionné. Il crée le rapport de couverture mais il ne montre pas les fichiers source. Je suppose que je dois fournir le src dir de chaque paquet.

J'ai donc pensé utiliser <foreach> Pour insérer chaque colis dans la structure. Je pourrais peut-être utiliser jacoco:merge Pour les fusionner, mais je ne suis pas sûr.

Aussi essayé includes="**/usr/** et includes="**/bin/**.

J'ai aussi quelques formes de fourmi différentes que je pourrais utiliser ici. pourrait aider? Aussi, peut-être que je pourrais "coder" les plugins et "fusionner" les rapports?

[~ # ~ ~] Edit [~ # ~] : Cela semblait avoir fonctionné lorsque vous fournissez des plug-ins multi-plugins comme:

<jacoco:report>
    <!--  This task needs the collected execution data and ...  -->
    <executiondata>
        <file file="${coverage.metadata.file}"/>
    </executiondata>
    <!--  the class files and optional source files ...  -->
    <structure name="JaCoCo Coverage Report">
        <classfiles>
            <fileset dir="${buildDirectory}/plugins/com.gandu.da.util.mangager.test/@dot">
                 <include name="**/*.class" />
            </fileset>
            <fileset dir="${buildDirectory}/plugins/com.gandu.da.util.alltests/@dot">
                 <include name="**/*.class" />
            </fileset>
        </classfiles>
        <sourcefiles encoding="UTF-8">
            <fileset dir="${buildDirectory}/plugins/com.gandu.da.util.mangager.test/src">
                <include name="**/*.Java" />
            </fileset>
            <fileset dir="${buildDirectory}/plugins/com.gandu.da.util.alltests/src">
                <include name="**/*.Java" />
            </fileset>
        </sourcefiles>
    </structure>
    
    <html destdir="${coverage.html.dir}"/>
    <csv destfile="${coverage.csv.file}"/>
    <xml destfile="${coverage.xml.file}"/>
</jacoco:report>

Est-il possible de mettre tous les noms recherchés (comme com.gandu.da.util.alltests) dans un fichier, lisez-les un par un et exécutez for (ou foreach) sur eux et ajoutez-les comme fileset peut-être (après avoir ajouté chacun avec chacun avec le chemin)?

11
vesii

La question ne répond pas à l'une des conditions préalables déclarées:

les dossiers de source spécifiés doivent être le parent direct des dossiers qui définissent le Java packages

--sourcefiles /buildFiles/plugins/com.gandu.da.util.test/src

Les grades peuvent être beaucoup plus chantes de script que la CLI ou Maven.

2
Martin Zeitler