182 votes

Obtention du message "Skipping JaCoCo execution due to missing execution data file" lors de l'exécution de JaCoCo.

J'utilise Maven 3.0.3, JUnit 4.8.1 et Jacoco 0.6.3.201306030806, et j'essaie de créer des rapports de couverture de test.

J'ai un projet avec uniquement des tests unitaires, mais je n'arrive pas à faire fonctionner les rapports, j'obtiens sans cesse l'erreur suivante : Skipping JaCoCo execution due to missing execution data file quand je cours :

mvn clean install -P test-coverage

Voici comment mon pom est configuré :

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.14.1</version>
  <configuration>
    <reuseForks>true</reuseForks>
    <argLine>-Xmx2048m</argLine>
  </configuration>
</plugin>
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-failsafe-plugin</artifactId>
  <version>2.14.1</version>
  <configuration>
    <reuseForks>true</reuseForks>
    <argLine>-Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>integration-test</goal>
        <goal>verify</goal>
      </goals>
    </execution>
  </executions>
</plugin>
...
<profile>
  <id>test-coverage</id>
  <build>
    <plugins>
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.6.3.201306030806</version>
        <configuration>
          <destfile>${basedir}/target/coverage-reports/jacoco-unit.exec</destfile>
          <datafile>${basedir}/target/coverage-reports/jacoco-unit.exec</datafile>
        </configuration>
        <executions>
          <execution>
            <id>prepare-unit-tests</id>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
          </execution>
          <!-- prepare agent for measuring integration tests -->
          <execution>
            <id>prepare-integration-tests</id>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
            <phase>pre-integration-test</phase>
            <configuration>
              <propertyName>itCoverageAgent</propertyName>
            </configuration>
          </execution>
          <execution>
            <id>jacoco-site</id>
            <phase>verify</phase>
            <goals>
              <goal>report</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</profile>

Tous mes tests se déroulent avec succès. Voici une partie de la sortie de Maven :

[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:prepare-agent (prepare-unit-tests) @ myproject ---
[INFO] argLine set to -javaagent:/Users/davea/.m2/repository/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec
[INFO] 
    ...
Tests run: 14, Failures: 0, Errors: 0, Skipped: 0

[INFO]
    ...
[INFO] 
[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:prepare-agent (prepare-integration-tests) @ myproject ---
[INFO] itCoverageAgent set to -javaagent:/Users/davea/.m2/repository/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec 
[INFO] 
[INFO] --- maven-failsafe-plugin:2.14.1:integration-test (default) @ myproject ---
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO] 
[INFO] --- maven-failsafe-plugin:2.14.1:verify (default) @ myproject ---
[INFO] Failsafe report directory: /Users/davea/Dropbox/workspace/myproject/target/failsafe-reports
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO] 
[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:report (jacoco-site) @ myproject ---
[INFO] Skipping JaCoCo execution due to missing execution data file
[INFO] 

Une idée de la configuration qui me manque ?

5voto

BoneGoat Points 236

Comme l'a dit Tdrury :

changez la configuration de votre plugin en ceci :

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.3.201306030806</version>
    <executions>
      <!-- prepare agent for measuring integration tests -->
      <execution>
        <id>prepare-integration-tests</id>
        <phase>pre-integration-test</phase>
        <goals>
          <goal>prepare-agent</goal>
        </goals>
        <configuration>
          <destFile>${basedir}/target/coverage-reports/jacoco-unit.exec</destFile>
        </configuration>
      </execution>
      <execution>
        <id>jacoco-site</id>
        <phase>post-integration-test</phase>
        <goals>
          <goal>report</goal>
        </goals>
        <configuration>
          <dataFile>${basedir}/target/coverage-reports/jacoco-unit.exec</dataFile>
        </configuration>
      </execution>
    </executions>
  </plugin>

Modifier : Je viens de remarquer une chose importante, destFile et dataFile semblent sensibles à la casse, donc c'est censé être destFile, pas destfile.

5voto

Pawel Kruszewski Points 465

J'ai essayé toutes les réponses, mais seule la combinaison de conseils suivante a fonctionné pour moi. Pourquoi ? J'avais des exigences très spécifiques :

  1. JaCoCo génère un rapport lorsque la construction est exécutée à partir de la ligne de commande : mvn clean verify (Maven 3.6.0)
  2. Intellij IDEA (2019.01) exécute également mes tests.
  3. Tout fonctionne en présence d'un autre javaagent défini dans surefire plugin

Solution - précéder argLine valeur dans surefire configuration avec la propriété maven "late replacement @{...} comme expliqué dans surefire FAQ ( ma configuration fixe )

Comment utiliser les propriétés définies par d'autres plugins dans argLine ? Maven remplace les propriétés pour

${...} dans pom.xml avant l'exécution d'un plugin. Ainsi, Surefire ne verrait jamais les caractères de remplacement dans sa propriété argLine. Depuis la version 2.17, une autre syntaxe est utilisée pour ces propriétés,

@{...} permet le remplacement tardif des propriétés lors de l'exécution du plugin, ainsi les propriétés qui ont été modifiées par d'autres plugins seront récupérées correctement.

Échec au premier essai - définir jaCoCoArgLine la propriété dans prepare-agent configuration des objectifs de jacoco - le scénario n'a pas répondu à ma deuxième exigence, IntelliJ IDEA n'a pas pu trouver l'agent pour jmockit que j'utilise dans le projet pour le mocking des méthodes statiques.

5voto

afkbrb Points 61

Je viens de rencontrer le même problème.

J'ai une classe nommée HelloWorld et j'ai créé une classe de test nommée HelloWorldTests puis j'ai obtenu le résultat suivant Skipping JaCoCo execution due to missing execution data file.

J'ai ensuite essayé de changer mon pom.xml pour le faire fonctionner, mais la tentative a échoué.

Enfin, je renomme simplement HelloWorldTests a HelloWorldTest et ça a marché !

Donc je suppose que, par défaut jacoco ne reconnaît que les classes de test nommées de la manière suivante XxxTest ce qui indique qu'il s'agit de la classe de test pour Xxx . Il suffit donc de renommer vos classes de test dans ce format pour que cela fonctionne !

5voto

kyakya Points 861

Lorsque vous utilisez le maven-surefire-plugin ou le maven-failsafe-plugin, vous ne devez pas utiliser un forkCount de 0 ou définir le forkMode sur never car cela empêcherait l'exécution des tests avec le javaagent défini et aucune couverture ne serait enregistrée.

réf : https://www.eclemma.org/jacoco/trunk/doc/maven.html

c'est mon Gist

4voto

Waqar Detho Points 1160

J'avais le même problème. J'ai mis à jour la version de Jacoco de 0.6 à 0.8 et mis à jour le plugin Surefire également. La commande suivante a généré des rapports Jacoco dans le dossier site/jacoco/ :

mvn clean jacoco:prepare-agent install jacoco:report

Mes configurations maven sont les suivantes :

<plugins>
    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.6</version>
        <executions>
            <execution>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
            </execution>
            <execution>
                <id>jacoco-report</id>
                <phase>test</phase>
                <goals>
                    <goal>report</goal>
                </goals>
                    </execution>
            <execution>
                <id>jacoco-check</id>
                <goals>
                    <goal>check</goal>
                </goals>
                <configuration>
                    <rules>
                        <rule>
                            <element>PACKAGE</element>
                            <limits>
                                <limit>
                                    <counter>LINE</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>0.0</minimum>
                                </limit>
                            </limits>
                        </rule>
                    </rules>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
            <forkedProcessExitTimeoutInSeconds>60</forkedProcessExitTimeoutInSeconds>
            <forkCount>1</forkCount>
        </configuration>
    </plugin>
</plugins>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X