Ottenere "Saltare l'esecuzione di JaCoCo a causa di file di dati di esecuzione mancanti" durante l'esecuzione di JaCoCo


123

Sto utilizzando Maven 3.0.3, JUnit 4.8.1 e Jacoco 0.6.3.201306030806 e sto cercando di creare rapporti di copertura dei test.

Ho un progetto con solo unit test, ma non riesco a far funzionare i rapporti, ricevo ripetutamente l'errore: Skipping JaCoCo execution due to missing execution data filequando eseguo:

mvn clean install -P test-coverage

Ecco come è configurato il mio pom:

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

Tutti i miei test vengono eseguiti correttamente. Ecco alcuni dei risultati di 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] 

Qualche idea su quale configurazione mi manca?



Sembra che tu abbia anche test di integrazione nel tuo pom, che potrebbe essere una distrazione. Inoltre, abbiamo rimosso destFilee lasciato che scrivesse nel file target / jacoco.exec predefinito.
MarkHu

Ho pubblicato la risposta in questa posizione.
Shivkumar Kawtikwar

Risposte:


135

jacoco-Maven-plug: 0.7.10-SNAPSHOT

Da jacoco: preparare-agente che dice:

Uno dei modi per farlo in caso di plug-in maven-surefire è usare la sintassi per la valutazione tardiva delle proprietà:

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

Nota il @{argLine}che è aggiunto a -your -extra -arguments.

Grazie Slava Semushin per aver notato il cambiamento e aver segnalato nel commento .

jacoco-Maven-plug: 0.7.2-SNAPSHOT

A seguire jacoco: prepare-agent che dice:

[org.jacoco: jacoco-maven-plugin: 0.7.2-SNAPSHOT: prepare-agent] Prepara una proprietà che punta all'agente di runtime JaCoCo che può essere passato come argomento VM all'applicazione sotto test. A seconda del tipo di packaging del progetto per impostazione predefinita viene impostata una proprietà con il seguente nome:

  • tycho.testArgLine per il tipo di packaging eclipse-test-plugin e
  • argLine altrimenti.

Notare che queste proprietà non devono essere sovrascritte dalla configurazione di prova, altrimenti non è possibile collegare l'agente JaCoCo. Se hai bisogno di parametri personalizzati, aggiungili. Per esempio:

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

Le informazioni sulla copertura risultante vengono raccolte durante l'esecuzione e, per impostazione predefinita, scritte in un file al termine del processo.

dovresti cambiare la seguente riga nella maven-surefire-pluginconfigurazione del plugin da (nota l' ${argLine}interno <argLine>):

<argLine>-Xmx2048m</argLine>

per

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

Apporta anche le modifiche necessarie all'altro plug-in maven-failsafe-plugine sostituisci quanto segue (di nuovo, nota il ${argLine}):

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

per

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

Ora però, c'è questo problema, senza l'obiettivo Jacoco, la compilazione fallisce.
Andreas

Ha lavorato per ma ho dovuto usare tycho.testArgLine poiché sto usando tycho.
Raffi Khatchadourian

1
Il collegamento citato ora ha un suggerimento leggermente diverso da usare @{argLine}.
Slava Semushin

2
Esattamente questo era il mio problema. Avevo argomenti personalizzati nel comando mvn mvn clean package sonar:sonar -U -DargLine="-Dxxx=yyy". Non sto dichiarando esplicitamente plug-in maven-safe e impostando le configurazioni. Aggiungo solo il segnaposto argLine nella riga di comando di Maven come mvn clean package sonar:sonar -U -DargLine="@{argLine} -Dxxx=yyy". Ora viene generato il file jacoco.exec e il report di copertura viene generato nel sonar.
Renato Ivancic

1
Funziona !!! Il problema era dovuto a una configurazione <argLine> aggiunta su maven-surefire-plugin per aumentare la memoria per i test di integrazione Configurazione di <argLine> $ {argLine} --my - additional-arguments - here-- </ argLine > risolto il problema
Massimo Da Ros

23

Ho riscontrato un problema leggermente diverso che ha restituito lo stesso errore.

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

La verità è che questo errore viene restituito per molte, molte ragioni. Abbiamo sperimentato le diverse soluzioni su Stack Overflow, ma abbiamo riscontrato che questa risorsa è la migliore. Elimina le molte e diverse potenziali ragioni per cui Jacoco potrebbe restituire lo stesso errore.

Per noi, la soluzione era aggiungere un preparato-agente alla configurazione.

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

Immagino che la maggior parte degli utenti lo sperimenterà per diversi motivi, quindi dai un'occhiata alla suddetta risorsa!


2
Penso che tu abbia centrato il punto. Le persone possono cercarlo su Google per una "soluzione rapida", ma la risposta più corretta sarebbe "La verità è che questo errore viene restituito per molte, molte ragioni". Ho solo bisogno di scoprire di cosa si tratta. Per me, è stato un genitore pom che ha sovrascritto <argLine> nel plugin maven-surefire.
tuan.dinh

Questo! Grazie. Ho ricevuto lo stesso messaggio, ma era perché il mio plug-in infallibile cercava solo i file denominati **/*Test.javaquando le mie classi di test sono state denominate*Tests.java
Roger Worrell

Ho avuto due problemi: 1. Nessuna classe di test di sorta, è necessaria almeno una *Test.javaclasse e un metodo di test annotato con @Testcosì Jacoco può fare qualcosa. 2. In Travis le variabili d'ambiente per il mio progetto, con errori di battitura SONART_TOKEN=*****, avrebbero dovuto essere nominate SONAR_TOKEN=*****. Vedi la documentazione di Travis qui , cerca or define SONAR_TOKEN in your Repository Settings. Dopo averlo risolto, la build è stata eseguita correttamente. Puoi visualizzare il mio progetto gitbhub in questione .
Jose Quijada

16

Potrebbe verificarsi un caso in cui qualche altra configurazione o plug-in argline in pom potrebbe sovrascrivere l'impostazione dell'ordine di esecuzione jacoco.

argLine impostato su -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

Uno degli esempi

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

Dopo aver eliminato argLine da questi plugin, jacoco ha iniziato a funzionare normalmente.


Ho risolto il mio problema. Ottimo posto!
user1974753

13

Si può anche ottenere l'errore "Saltare l'esecuzione di JaCoCo a causa di file di dati di esecuzione mancanti" a causa di test mancanti nel progetto. Ad esempio, quando avvii un nuovo progetto e non hai alcun file * Test.java.


5

Cosa ha detto tdrury:

cambia la configurazione del tuo plugin in questo:

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

Modifica: ho appena notato una cosa importante, destFile e dataFile sembrano case sensitive, quindi dovrebbe essere destFile, non destfile.


5

So che questa domanda è piuttosto vecchia, ma se qualcuno come me viene qui in cerca di una risposta, questo potrebbe aiutare. Sono stato in grado di superare l'errore di cui sopra con questo.

1) Rimuovi la parte di codice sottostante dal plugin maven-surefire-plugin

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

2) Aggiungi il seguente obiettivo:

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

3

Mi sono imbattuto nello stesso problema proprio ora.

Ho una classe denominata HelloWorlde ho creato una classe di test per essa denominata HelloWorldTests, quindi ho ottenuto l'outputSkipping JaCoCo execution due to missing execution data file.

Ho quindi provato a cambiare il mio pom.xmlper farlo funzionare, ma il tentativo è fallito.

Infine, ho semplicemente rinominato HelloWorldTestsin HelloWorldTeste ha funzionato!

Quindi immagino che, per impostazione predefinita , jacoco riconosca solo la classe di test denominata like XxxTest, il che indica che è la classe di test per Xxx. Quindi rinominare semplicemente le classi di test in questo formato dovrebbe funzionare!


2

Ho provato tutte le risposte ma solo la seguente combinazione di consigli ha funzionato per me. Perché? Avevo requisiti molto specifici:

  1. JaCoCo genera un report quando la build viene eseguita dalla riga di comando: mvn clean verify(Maven 3.6.0)
  2. Anche Intellij IDEA (2019.01) esegue i miei test
  3. Funziona tutto in presenza di un altro javaagentdefinito nel surefireplugin

Soluzione : anteponi il argLinevalore nella surefireconfigurazione con la proprietà maven "sostituzione tardiva" @{...}come spiegato nelle surefire FAQ (la mia configurazione fissa )

Come si utilizzano le proprietà impostate da altri plugin in argLine? Maven fa la sostituzione della proprietà per

$ {...} valori in pom.xml prima che venga eseguito qualsiasi plugin. Quindi Surefire non vedrebbe mai i segnaposto nella sua proprietà argLine. Poiché la versione 2.17 utilizza una sintassi alternativa per queste proprietà,

@ {...} consente la sostituzione tardiva delle proprietà quando il plug-in viene eseguito, quindi le proprietà che sono state modificate da altri plug-in verranno rilevate correttamente.

Primo tentativo fallito - definire la proprietà jaCoCoArgLine nella prepare-agentconfigurazione dell'obiettivo di jacoco- lo scenario ha fallito il mio secondo requisito, IntelliJ IDEA non è riuscito a capire l'agente per jmockit che uso nel progetto per il mocking del metodo statico


Ha affrontato lo stesso problema durante l'utilizzo con JMockit ed è stato in grado di risolvere il problema con questa soluzione. cioè l'aggiunta di argLine nel plugin infallibile
Karthik Rao il

1

Ho aggiunto un progetto Maven / Java con 1 classe di dominio con le seguenti caratteristiche:

  • Test di unità o integrazione con i plugin Surefire e Failsafe.
  • Findbugs.
  • Copertura di prova tramite Jacoco .

Dove sono i risultati Jacoco? Dopo aver testato ed eseguito "mvn clean", è possibile trovare i risultati in "target / site / jacoco / index.html". Apri questo file nel browser.

Godere!

Ho cercato di mantenere il progetto il più semplice possibile. Il progetto mette insieme molti suggerimenti da questi post in un progetto di esempio. Grazie, collaboratori!


Ho provato il tuo progetto git ma non è chiaro come vedere il report.
Nagaraj Vittal

Dove sono i risultati Jacoco? Dopo aver testato ed eseguito "mvn clean", è possibile trovare i risultati in "target / site / jacoco / index.html". Apri questo file nel browser.
tm1701

Potresti voler ricollegare il tuo repository a stackoverflow. Ho avuto difficoltà a trovare di nuovo la domanda dopo aver trovato un bug nella tua demo.
Wolfgang Fahl,

E ancora non funziona come previsto :-( la directory di destinazione ha solo aggregate.exec come contenuto quando si esegue un'installazione pulita mvn ...
Wolfgang Fahl

1

Ho lottato per giorni. Ho provato tutte le diverse configurazioni suggerite in questo thread. Nessuno di loro funziona. Infine, trovo che solo la configurazione importante sia l' obiettivo di preparazione dell'agente . Ma devi metterlo nella fase giusta. Ho visto così tanti esempi metterlo nel " test di pre-integrazione ", è fuorviante, poiché verrà eseguito solo dopo il test unitario. Quindi il test unitario non sarà strumentato.

La configurazione corretta dovrebbe usare solo la fase predefinita (non specificare la fase esplicitamente). E di solito, non è necessario concentrarsi su un plug-in sicuro .

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

0

L'esecuzione dice che sta inserendo i dati jacoco in /Users/davea/Dropbox/workspace/myproject/target/jacoco.exec ma la tua configurazione maven sta cercando i dati in $ {basedir} / target / coverage-reports / jacoco-unit. exec.


1
Bene, allora perché il plugin ignora ciò che ho specificato nella configurazione?
Dave

prova a spostare la configurazione del file destfile nella configurazione dell'esecuzione di prepare-agent. Non tutti i plugin Maven gestiscono gentilmente l'ereditarietà della configurazione.
tdrury

0

La mia risposta è molto tardi ma per altri utenti Nel tuo caso devi configurare il plug-in fail-safe per utilizzare la configurazione dell'agente della riga di comando salvata nella variabile itCoverageAgent. Per esempio

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

Nella tua configurazione Maven, jacoco prepara gli argomenti della riga di comando nella fase di preparazione dell'agente, ma il plug-in fail-safe non lo utilizza, quindi non c'è un file di dati di esecuzione.


0

Prova ad usare:

mvn jacoco:report -debug

per visualizzare i dettagli sul processo di segnalazione.

Ho configurato il mio jacoco in questo modo:

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

Quindi lo mvn jacoco:report -debugmostra utilizzando la configurazione predefinita, il che significa che jacoco.execnon è in ~/jacoco.exec. L'errore dicemissing execution data file .

Quindi usa la configurazione predefinita:

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

E tutto funziona bene.


0

A volte l'esecuzione viene eseguita per la prima volta e quando eseguiamo un'installazione pulita di maven non viene generata dopo. Il problema stava usando true per skipMain e skip proprietà sotto maven-compiler-plugin del file pom principale. Rimuoverli se sono stati presentati come parte di qualsiasi problema o suggerimento.


0

Nel mio caso, l'agente di preparazione aveva una destFileconfigurazione diversa , ma di conseguenza il rapporto doveva essere configurato con un dataFile, ma questa configurazione mancava. Una volta dataFileaggiunto, ha iniziato a funzionare bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.