Obtenir «Ignorer l'exécution de JaCoCo en raison d'un fichier de données d'exécution manquant» lors de l'exécution de JaCoCo

123

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 des tests unitaires uniquement, mais je ne peux pas faire exécuter de rapports, j'obtiens à plusieurs reprises l'erreur: Skipping JaCoCo execution due to missing execution data filequand je lance:

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 fonctionnent avec succès. Voici quelques-uns des résultats 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] 

Des idées sur la configuration qui me manque?

Dave
la source
Il semble que vous ayez également des tests d'intégration dans votre pom, ce qui pourrait être une distraction. De plus, nous avons supprimé le destFileet l'avons laissé écrire dans le fichier cible par défaut / jacoco.exec.
MarkHu
J'ai publié une réponse à cet endroit.
Shivkumar Kawtikwar

Réponses:

135

jacoco-maven-plugin: 0.7.10-INSTANTANÉ

De jacoco: agent de préparation qui dit:

Une des façons de le faire dans le cas de maven-surefire-plugin - est d'utiliser la syntaxe pour l'évaluation tardive des propriétés:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <argLine>@{argLine} -your -extra -arguments</argLine>
  </configuration>
</plugin>

Notez le @{argLine}qui est ajouté à -your -extra -arguments.

Merci Slava Semushin pour avoir remarqué le changement et signalé dans le commentaire .

jacoco-maven-plugin: 0.7.2-INSTANTANÉ

Suivant jacoco: agent de préparation qui dit:

[org.jacoco: jacoco-maven-plugin: 0.7.2-SNAPSHOT: prepare-agent] Prépare une propriété pointant vers l'agent d'exécution JaCoCo qui peut être passé comme argument VM à l'application testée. En fonction du type d'empaquetage du projet, une propriété avec le nom suivant est définie par défaut:

  • tycho.testArgLine pour le type d'emballage eclipse-test-plugin et
  • argLine sinon.

Notez que ces propriétés ne doivent pas être écrasées par la configuration de test, sinon l'agent JaCoCo ne peut pas être attaché. Si vous avez besoin de paramètres personnalisés, veuillez les ajouter. Par exemple:

<argLine>${argLine} -your -extra -arguments</argLine>

Les informations de couverture qui en résultent sont collectées pendant l'exécution et écrites par défaut dans un fichier lorsque le processus se termine.

vous devriez changer la ligne suivante dans la maven-surefire-pluginconfiguration du plugin à partir de (notez l' ${argLine}intérieur <argLine>):

<argLine>-Xmx2048m</argLine>

à

<argLine>${argLine} -Xmx2048m</argLine>

Apportez également les modifications nécessaires à l'autre plugin maven-failsafe-pluginet remplacez ce qui suit (encore une fois, notez le ${argLine}):

<argLine>-Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>

à

<argLine>${argLine} -Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>
Jacek Laskowski
la source
Maintenant cependant, theres ce problème, sans la cible jacoco, la construction échoue.
Andreas
J'ai travaillé pour mais j'ai dû utiliser tycho.testArgLine puisque j'utilise tycho.
Raffi Khatchadourian
1
Le lien cité a maintenant une suggestion légèrement différente à utiliser @{argLine}.
Slava Semushin
2
C'était exactement mon problème. J'avais des arguments personnalisés dans la commande mvn mvn clean package sonar:sonar -U -DargLine="-Dxxx=yyy". Je ne déclare pas explicitement maven-surefire-plugin et ne définit pas les configurations. Je viens d'ajouter l'espace réservé argLine dans la ligne de commande maven comme mvn clean package sonar:sonar -U -DargLine="@{argLine} -Dxxx=yyy". Le fichier jacoco.exec est maintenant généré et le rapport de couverture est généré dans le sondeur.
RenatoIvancic
1
Ça marche !!! Le problème était dû à une configuration <argLine> que j'ai ajoutée sur maven-surefire-plugin afin d'augmenter la mémoire pour les tests d'intégration Configurer <argLine> $ {argLine} --my - additional-arguments - here-- </ argLine > résolu le problème
Massimo Da Ros
23

J'ai été confronté à un problème différent qui a renvoyé la même erreur.

Skipping JaCoCo execution due to missing execution data /target/jacoco.exec

La vérité est que cette erreur est renvoyée pour de très nombreuses raisons. Nous avons expérimenté les différentes solutions sur Stack Overflow, mais nous avons trouvé que cette ressource était la meilleure. Cela démolit les nombreuses raisons potentielles pour lesquelles Jacoco pourrait renvoyer la même erreur.

Pour nous, la solution était d'ajouter un agent de préparation à la configuration.

<execution>
   <id>default-prepare-agent</id>
   <goals>
       <goal>prepare-agent</goal>
   </goals>
</execution>

J'imagine que la plupart des utilisateurs en feront l'expérience pour différentes raisons, alors jetez un œil à la ressource susmentionnée!

Chad Van De Hey
la source
2
Je pense que vous avez réussi. Les gens peuvent chercher une «solution rapide» sur Google, mais la réponse la plus correcte serait «La vérité est que cette erreur est renvoyée pour de très nombreuses raisons». Juste besoin de savoir ce que c'est. Pour moi, c'était un pom parent écrasant le <argLine> dans le plugin maven-surefire-plugin.
tuan.dinh
Ce! Merci. J'ai reçu le même message, mais c'était parce que mon plugin infaillible ne cherchait que les fichiers nommés **/*Test.javalorsque mes classes de test ont été nommées*Tests.java
Roger Worrell
J'ai eu deux problèmes: 1. Aucune classe de test, j'ai besoin d'au moins une *Test.javaclasse et une méthode de test annotée avec @Testpour que Jacoco puisse faire quelque chose. 2. Dans les variables d'environnement Travis pour mon projet, il y avait une faute de frappe SONART_TOKEN=*****, aurait dû être nommé SONAR_TOKEN=*****. Consultez la documentation Travis ici , recherchez or define SONAR_TOKEN in your Repository Settings. Après avoir corrigé cela, la construction s'est exécutée avec succès. Vous pouvez voir mon projet gitbhub en question .
Jose Quijada
16

Il peut arriver qu'une autre configuration ou plugin d'argline dans pom remplace la configuration de l'ordre d'exécution jacoco.

argLine défini sur -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

Un des exemples

           <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.16</version>
                <configuration>
                    <forkCount>5</forkCount>
                    <reuseForks>true</reuseForks>
                    <argLine>-Dnet.sf.ehcache.disabled=true</argLine>
                </configuration>
            </plugin>

Après avoir supprimé argLine de ces plugins, jacoco a commencé à fonctionner normalement.

Atish Narlawar
la source
J'ai résolu mon problème. Super endroit!
user1974753
13

On peut également obtenir l'erreur «Sauter l'exécution de JaCoCo en raison d'un fichier de données d'exécution manquant» en raison de tests manquants dans le projet. Par exemple, lorsque vous lancez un nouveau projet et que vous n'avez aucun fichier * Test.java.

Tanya Jivvca
la source
5

F Ce que Tdrury a dit:

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>

Edit: Je viens de remarquer une chose importante, destFile et dataFile semblent sensibles à la casse, ils sont donc censés être destFile, pas destfile.

BoneGoat
la source
5

Je sais que cette question est assez ancienne, mais si quelqu'un comme moi vient ici à la recherche d'une réponse, cela pourrait aider. J'ai pu surmonter l'erreur ci-dessus avec cela.

1) Supprimez le morceau de code ci-dessous du plugin maven-surefire-plugin

 <reuseForks>true</reuseForks>
 <argLine>-Xmx2048m</argLine>

2) Ajoutez l'objectif ci-dessous:

<execution>
<id>default-prepare-agent</id>
<goals>
   <goal>prepare-agent</goal>
</goals>
</execution>
Toujours un nouveau
la source
3

Je suis tombé sur le même problème tout à l'heure.

J'ai une classe nommée HelloWorld, et j'ai créé une classe de test pour elle nommée HelloWorldTests, puis j'ai obtenu la sortieSkipping JaCoCo execution due to missing execution data file.

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

Enfin, je renomme simplement HelloWorldTestsen HelloWorldTest, et cela a fonctionné!

Je suppose donc que, par défaut , jacoco ne reconnaît que la classe de test nommée like XxxTest, ce qui indique que c'est la classe de test pour Xxx. Renommez simplement vos classes de test dans ce format devrait fonctionner!

afkbrb
la source
2

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 javaagentdéfini dans le surefireplugin

Solution - ajouter la argLinevaleur dans la surefireconfiguration avec la propriété maven "remplacement tardif" @{...}comme expliqué dans la surefire FAQ ( ma configuration fixe )

Comment utiliser les propriétés définies par d'autres plugins dans argLine? Maven fait le remplacement de propriété pour

$ {...} dans pom.xml avant l'exécution de tout plugin. Ainsi, Surefire ne verrait jamais les espaces réservés dans sa propriété argLine. Depuis la version 2.17 utilisant une syntaxe alternative pour ces propriétés,

@ {...} permet le remplacement tardif des propriétés lorsque le plugin est exécuté, donc les propriétés qui ont été modifiées par d'autres plugins seront correctement récupérées.

Échec du premier essai - définir la propriété jaCoCoArgLine dans la prepare-agentconfiguration de l'objectif de jacoco- le scénario a échoué ma deuxième exigence, IntelliJ IDEA n'a pas pu déterminer l'agent pour jmockit que j'utilise dans le projet pour la simulation de méthode statique

Pawel Kruszewski
la source
Face au même problème lors de l'utilisation avec JMockit et a pu résoudre le problème avec cette solution. ie ajouter argLine dans le plugin surefire
Karthik Rao
1

J'ai ajouté un projet Maven / Java avec 1 classe de domaine avec les fonctionnalités suivantes:

  • Tests unitaires ou d'intégration avec les plugins Surefire et Failsafe.
  • Findbugs.
  • Couverture de test via Jacoco .

Où sont les résultats Jacoco? Après avoir testé et exécuté «mvn clean», vous pouvez trouver les résultats dans «target / site / jacoco / index.html». Ouvrez ce fichier dans le navigateur.

Prendre plaisir!

J'ai essayé de garder le projet aussi simple que possible. Le projet rassemble de nombreuses suggestions issues de ces articles dans un exemple de projet. Merci, contributeurs!

tm1701
la source
J'ai essayé votre projet git mais il n'est pas clair que voir le rapport.
Nagaraj Vittal
Où sont les résultats Jacoco? Après avoir testé et exécuté «mvn clean», vous pouvez trouver les résultats dans «target / site / jacoco / index.html». Ouvrez ce fichier dans le navigateur.
tm1701
Vous souhaiterez peut-être relier votre référentiel à stackoverflow. J'ai eu du mal à retrouver la question après avoir trouvé un bogue dans votre démo.
Wolfgang Fahl
Et ne fonctionne toujours pas comme prévu :-( le répertoire cible n'a que aggregate.exec car son contenu lors de l'installation propre de mvn ...
Wolfgang Fahl
1

J'ai lutté pendant des jours. J'ai essayé toutes les différentes configurations suggérées dans ce fil. Aucun d'eux ne fonctionne. Enfin, je trouve que seule la configuration importante est l' objectif de préparation de l'agent . Mais vous devez le mettre dans la bonne phase. J'ai vu tant d'exemples le mettre dans le " test de pré-intégration ", c'est trompeur, car il ne sera exécuté qu'après le test unitaire. Le test unitaire ne sera donc pas instrumenté.

La bonne configuration doit simplement utiliser la phase par défaut (ne spécifiez pas la phase explicitement). Et généralement, vous n'avez pas besoin de vous masser de maven-surefire-plugin .

  <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.4</version>
    <executions>
      <execution>
        <id>default-prepare-agent</id>
        <goals>
          <goal>prepare-agent</goal>
        </goals>
      </execution>
      <execution>
        <id>jacoco-site</id>
        <phase>post-integration-test</phase>
        <goals>
          <goal>report</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
Jianwu Chen
la source
0

L'exécution dit qu'elle met les données jacoco dans /Users/davea/Dropbox/workspace/myproject/target/jacoco.exec mais votre configuration maven recherche les données dans $ {basedir} / target / coverage-reports / jacoco-unit. exec.

tdrury
la source
1
Bon, alors pourquoi le plugin ignore-t-il ce que je spécifie dans la configuration?
Dave
essayez de déplacer votre configuration destfile dans la configuration de l'exécution de prepare-agent. Tous les plugins maven ne gèrent pas gracieusement l'héritage de configuration.
tdrury
0

Ma réponse est très tardive mais pour les autres utilisateurs Dans votre cas, vous devez configurer le branchement de sécurité pour utiliser la configuration de l'agent de ligne de commande enregistrée dans la variable itCoverageAgent. Par exemple

<configuration>
    <argLine>${itCoverageAgent}</argLine>
</configuration>

Dans votre configuration maven, jacoco prépare les arguments de ligne de commande dans la phase de préparation de l'agent, mais le plugin de sécurité ne l'utilise pas donc il n'y a pas de fichier de données d'exécution.

jpl
la source
0

Essayez d'utiliser:

mvn jacoco:report -debug

pour voir les détails de votre processus de signalement.

J'ai configuré mon jacoco comme ceci:

<configuration>
    <dataFile>~/jacoco.exec</dataFile>
    <outputDirectory>~/jacoco</outputDirectory>
</configuration>

Puis l' mvn jacoco:report -debugaffiche en utilisant la configuration par défaut, ce qui signifie qu'il jacoco.execn'est pas dans ~/jacoco.exec. L'erreur ditmissing execution data file .

Alors utilisez simplement la configuration par défaut:

<execution>
    <id>default-report</id>
    <goals>
    </goals>
    <configuration>
        <dataFile>${project.build.directory}/jacoco.exec</dataFile>
        <outputDirectory>${project.reporting.outputDirectory}/jacoco</outputDirectory>
    </configuration>
</execution>

Et tout fonctionne bien.

xiaoLiuLiu
la source
0

Parfois, l'exécution s'exécute pour la première fois, et lorsque nous effectuons une installation propre, elle ne se produit pas après cela. Le problème était d'utiliser true pour skipMain et skip propriétés sous maven-compiler-plugin du fichier pom principal. Supprimez-les s'ils ont été introduits dans le cadre d'un problème ou d'une suggestion.

Srini M
la source
0

Dans mon cas, l'agent de préparation avait une destFileconfiguration différente , mais en conséquence, le rapport devait être configuré avec un dataFile, mais cette configuration était manquante. Une fois le a dataFileété ajouté, il a commencé à fonctionner correctement.

Pavan Kumar
la source