Beim Ausführen von JaCoCo wird "Überspringen der JaCoCo-Ausführung aufgrund fehlender Ausführungsdatendatei" angezeigt

122

Ich verwende Maven 3.0.3, JUnit 4.8.1 und Jacoco 0.6.3.201306030806 und versuche, Testberichterstattungsberichte zu erstellen.

Ich habe ein Projekt mit Unit - Tests nur, aber ich kann keine Berichte erhalten zu laufen, ich bin immer wieder den Fehler bekommen: Skipping JaCoCo execution due to missing execution data filewenn ich laufe:

mvn clean install -P test-coverage

So ist mein Pom konfiguriert:

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

Alle meine Tests laufen erfolgreich. Hier sind einige der Ausgaben von 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] 

Irgendwelche Ideen, welche Konfiguration mir fehlt?

Dave
quelle
Anscheinend haben Sie auch Integrationstests in Ihrem Pom, was eine Ablenkung sein könnte. Außerdem haben wir die destFileDatei entfernt und in die Standarddatei target / jacoco.exec schreiben lassen.
MarkHu
Ich habe an dieser Stelle eine Antwort gepostet .
Shivkumar Kawtikwar

Antworten:

133

Jacoco-Maven-Plugin: 0.7.10-SNAPSHOT

Aus Jacoco: Prepare-Agent , der sagt:

Eine Möglichkeit, dies im Falle eines Maven-Surefire-Plugins zu tun, besteht darin, die Syntax für die späte Bewertung von Eigenschaften zu verwenden:

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

Beachten Sie das @{argLine}, was hinzugefügt wurde -your -extra -arguments.

Vielen Dank an Slava Semushin, dass sie die Änderung bemerkt und im Kommentar berichtet hat .

Jacoco-Maven-Plugin: 0.7.2-SNAPSHOT

Nach jacoco: Prepare-Agent , der sagt:

[org.jacoco: jacoco-maven-plugin: 0.7.2-SNAPSHOT: prepare-agent] Bereitet eine Eigenschaft vor, die auf den JaCoCo-Laufzeitagenten verweist und als VM-Argument an die zu testende Anwendung übergeben werden kann. Abhängig vom Projektverpackungstyp wird standardmäßig eine Eigenschaft mit dem folgenden Namen festgelegt:

  • tycho.testArgLine für den Verpackungstyp Eclipse-Test-Plugin und
  • sonst argLine.

Beachten Sie, dass diese Eigenschaften von der Testkonfiguration nicht überschrieben werden dürfen, da sonst der JaCoCo-Agent nicht angehängt werden kann. Wenn Sie benutzerdefinierte Parameter benötigen, fügen Sie diese bitte hinzu. Beispielsweise:

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

Die resultierenden Abdeckungsinformationen werden während der Ausführung gesammelt und standardmäßig in eine Datei geschrieben, wenn der Prozess beendet wird.

Sie sollten die folgende Zeile in der maven-surefire-pluginPlugin-Konfiguration von ändern (beachten Sie das ${argLine}Innere <argLine>):

<argLine>-Xmx2048m</argLine>

zu

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

Nehmen Sie auch die erforderlichen Änderungen am anderen Plugin vor maven-failsafe-pluginund ersetzen Sie Folgendes (beachten Sie erneut das ${argLine}):

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

zu

<argLine>${argLine} -Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>
Jacek Laskowski
quelle
Jetzt jedoch gibt es dieses Problem, ohne das Jacoco-Ziel schlägt der Build fehl.
Andreas
Arbeitete für, aber ich musste tycho.testArgLine verwenden, da ich tycho verwende.
Raffi Khatchadourian
1
Der zitierte Link hat jetzt einen etwas anderen Vorschlag @{argLine}.
Slava Semushin
2
Genau das war mein Problem. Ich hatte benutzerdefinierte Argumente im Befehl mvn mvn clean package sonar:sonar -U -DargLine="-Dxxx=yyy". Ich deklariere das Maven-Surefire-Plugin nicht explizit und setze Konfigurationen. Ich füge einfach argLine Platzhalter in die maven Kommandozeile wie hinzu mvn clean package sonar:sonar -U -DargLine="@{argLine} -Dxxx=yyy". Jetzt wird die Datei jacoco.exec generiert und ein Abdeckungsbericht im Sonar erstellt.
RenatoIvancic
1
Es klappt !!! Das Problem war auf eine <argLine> -Konfiguration zurückzuführen, die ich auf dem Maven-Surefire-Plugin hinzugefügt habe, um den Speicher für Integrationstests zu erhöhen. Konfigurieren von <argLine> $ {argLine} --my - zusätzliche Argumente - hier-- </ argLine > löste das Problem
Massimo Da Ros
23

Ich hatte ein etwas anderes Problem, das denselben Fehler zurückgab.

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

Die Wahrheit ist, dass dieser Fehler aus vielen, vielen Gründen zurückgegeben wird. Wir haben mit den verschiedenen Lösungen für den Stapelüberlauf experimentiert, fanden diese Ressource jedoch am besten. Es werden die vielen verschiedenen möglichen Gründe aufgezeigt, warum Jacoco denselben Fehler zurückgeben könnte.

Für uns bestand die Lösung darin, der Konfiguration einen Vorbereitungsagenten hinzuzufügen.

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

Ich würde mir vorstellen, dass die meisten Benutzer es aus verschiedenen Gründen erleben werden. Schauen Sie sich also die oben genannte Ressource an!

Chad Van De Hey
quelle
2
Ich denke du hast es geschafft. Die Leute mögen es für eine "schnelle Lösung" googeln, aber die richtigste Antwort wäre "Die Wahrheit ist, dieser Fehler wird aus vielen, vielen Gründen zurückgegeben". Ich muss nur herausfinden, was das ist. Für mich war es ein Elternteil, der die <argLine> im Maven-Surefire-Plugin überschrieb.
tuan.dinh
Dies! Vielen Dank. Ich habe die gleiche Nachricht erhalten, aber es lag daran, dass mein todsicheres Plugin nur nach Dateien suchte, die benannt wurden, **/*Test.javaals meine Testklassen benannt wurden*Tests.java
Roger Worrell
Ich hatte zwei Probleme: 1. Keine Testklassen, mindestens eine *Test.javaKlasse und eine mit Anmerkungen versehene Testmethode, @Testdamit Jacoco etwas tun kann. 2. In Travis sollten Umgebungsvariablen für mein Projekt, die Tippfehler hatten SONART_TOKEN=*****, benannt werden SONAR_TOKEN=*****. Siehe Travis-Dokumente hier , suchen Sie nach or define SONAR_TOKEN in your Repository Settings. Nachdem ich das behoben hatte, lief Build erfolgreich. Sie können mein fragliches Gitbhub-Projekt anzeigen .
Jose Quijada
15

Es kann vorkommen, dass ein anderes Argline-Setup oder Plugin in pom das Setup der Jacoco-Ausführungsreihenfolge überschreibt.

argLine gesetzt auf -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

Eines der Beispiele

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

Nachdem argLine von diesen Plugins entfernt wurde, begann jacoco normal zu arbeiten.

Atish Narlawar
quelle
Mein Problem gelöst. Toller Ort!
user1974753
13

Es kann auch der Fehler "Überspringen der JaCoCo-Ausführung aufgrund fehlender Ausführungsdatendatei" aufgrund fehlender Tests im Projekt angezeigt werden. Zum Beispiel, wenn Sie ein neues Projekt starten und überhaupt keine * Test.java-Dateien haben.

Tanya Jivvca
quelle
5

Was tdrury sagte:

Ändern Sie Ihre Plugin-Konfiguration wie folgt:

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

Bearbeiten: Ich habe gerade eine wichtige Sache bemerkt: destFile und dataFile scheinen zwischen Groß- und Kleinschreibung zu unterscheiden, daher sollte es destFile sein, nicht destfile.

BoneGoat
quelle
5

Ich weiß, dass diese Frage ziemlich alt ist, aber wenn jemand wie ich hierher kommt, um eine Antwort zu suchen, könnte dies helfen. Damit konnte ich den oben genannten Fehler überwinden.

1) Entfernen Sie den folgenden Code aus dem Plugin Maven-Surefire-Plugin

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

2) Fügen Sie das folgende Ziel hinzu:

<execution>
<id>default-prepare-agent</id>
<goals>
   <goal>prepare-agent</goal>
</goals>
</execution>
Immer ein newComer
quelle
3

Kam gerade über das gleiche Problem.

Ich habe eine Klasse mit dem Namen HelloWorldund habe eine Testklasse mit dem Namen erstellt HelloWorldTests. Dann habe ich die Ausgabe erhaltenSkipping JaCoCo execution due to missing execution data file.

Ich habe dann versucht, meine zu ändern pom.xml, damit es funktioniert, aber der Versuch ist fehlgeschlagen.

Schließlich benenne ich einfach HelloWorldTestszu HelloWorldTest, und es funktionierte!

Ich denke also, dass jacoco standardmäßig nur Testklassen mit dem Namen like erkennt XxxTest, was darauf hinweist, dass es die Testklasse für ist Xxx. Benennen Sie einfach Ihre Testklassen in dieses Format um, das sollte funktionieren!

afkbrb
quelle
2

Ich habe alle Antworten ausprobiert, aber nur die folgende Kombination von Ratschlägen hat für mich funktioniert. Warum? Ich hatte sehr spezielle Anforderungen:

  1. JaCoCo generiert einen Bericht, wenn der Build über die Befehlszeile ausgeführt wird: mvn clean verify(Maven 3.6.0)
  2. Intellij IDEA (2019.01) führt auch meine Tests durch
  3. Es funktioniert alles in Gegenwart eines anderen javaagentim surefirePlugin definierten Plugins

Lösung - Stellen Sie den argLineWert in der surefireKonfiguration mit der Maven-Eigenschaft "Late Replacement" voran, @{...}wie in den surefire FAQ ( meine feste Konfiguration ) erläutert.

Wie verwende ich Eigenschaften, die von anderen Plugins in argLine festgelegt wurden? Maven ersetzt Eigentum für

$ {...} Werte in pom.xml, bevor ein Plugin ausgeführt wird. Surefire würde die Platzhalter also niemals in seiner argLine-Eigenschaft sehen. Seit der Version 2.17 mit einer alternativen Syntax für diese Eigenschaften

@ {...} ermöglicht das späte Ersetzen von Eigenschaften, wenn das Plugin ausgeführt wird, sodass Eigenschaften, die von anderen Plugins geändert wurden, korrekt übernommen werden.

Fehler beim ersten Versuch - Definieren der Eigenschaft jaCoCoArgLine in der Zielkonfigurationprepare-agent von jacoco- Das Szenario hat meine zweite Anforderung nicht erfüllt. IntelliJ IDEA konnte den Agenten für jmockit, den ich im Projekt für das Verspotten statischer Methoden verwende, nicht ermitteln

Pawel Kruszewski
quelle
Bei der Verwendung mit JMockit trat das gleiche Problem auf und das Problem konnte mit dieser Lösung behoben werden. dh Hinzufügen von argLine im todsicheren Plugin
Karthik Rao
1

Ich habe ein Maven / Java-Projekt mit 1 Domänenklasse mit den folgenden Funktionen hinzugefügt :

  • Unit- oder Integrationstests mit den Plugins Surefire und Failsafe.
  • Findbugs.
  • Testabdeckung über Jacoco .

Wo sind die Jacoco-Ergebnisse? Nach dem Testen und Ausführen von 'mvn clean' finden Sie die Ergebnisse in 'target / site / jacoco / index.html'. Öffnen Sie diese Datei im Browser.

Genießen!

Ich habe versucht, das Projekt so einfach wie möglich zu halten. Das Projekt fasst viele Vorschläge aus diesen Beiträgen in einem Beispielprojekt zusammen. Vielen Dank, Mitwirkende!

tm1701
quelle
Ich habe Ihr Git-Projekt ausprobiert, aber es ist nicht klar, wie der Bericht angezeigt werden soll.
Nagaraj Vittal
Wo sind die Jacoco-Ergebnisse? Nach dem Testen und Ausführen von 'mvn clean' finden Sie die Ergebnisse in 'target / site / jacoco / index.html'. Öffnen Sie diese Datei im Browser.
tm1701
Möglicherweise möchten Sie Ihr Repository wieder mit dem Stackoverflow verknüpfen. Es fiel mir schwer, die Frage wieder zu finden, nachdem ich einen Fehler in Ihrer Demo gefunden hatte.
Wolfgang Fahl
Und funktioniert immer noch nicht wie erwartet :-( Das Zielverzeichnis hat nur aggregat.exec, da es Inhalt ist, wenn mvn sauber installiert wird ...
Wolfgang Fahl
1

Ich kämpfte tagelang. Ich habe alle in diesem Thread vorgeschlagenen Konfigurationen ausprobiert. Keiner von ihnen funktioniert. Schließlich finde ich nur die wichtige Konfiguration ist das Ziel des Vorbereitungsagenten . Aber Sie müssen es in die richtige Phase bringen. Ich habe so viele Beispiele im " Pre-Integration-Test " gesehen, das ist irreführend, da es erst nach dem Unit-Test ausgeführt wird. Der Unit-Test wird also nicht instrumentiert.

Die richtige Konfiguration sollte nur die Standardphase verwenden (geben Sie die Phase nicht explizit an). Und normalerweise müssen Sie sich nicht um das Maven-Surefire-Plugin kümmern .

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

Die Ausführung besagt, dass die Jacoco-Daten in /Users/davea/Dropbox/workspace/myproject/target/jacoco.exec abgelegt werden, aber Ihre Maven-Konfiguration sucht nach den Daten in $ {basedir} / target / Coverage-Reports / Jacoco-Unit. exec.

tdrury
quelle
1
Richtig, warum ignoriert das Plugin das, was ich in der Konfiguration angegeben habe?
Dave
Versuchen Sie, Ihre Destfile-Konfiguration in die Konfiguration der Prepare-Agent-Ausführung zu verschieben. Nicht alle Maven-Plugins behandeln die Vererbung von Konfigurationen freundlich.
Tdrury
0

Meine Antwort ist sehr spät, aber für andere Benutzer. In Ihrem Fall müssen Sie das ausfallsichere Plug-in konfigurieren, um die in der Variablen itCoverageAgent gespeicherte Konfiguration des Befehlszeilenagenten zu verwenden. Zum Beispiel

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

In Ihrer Maven-Konfiguration bereitet jacoco die Befehlszeilenargumente in der Phase des Agentenvorbereitens vor, das ausfallsichere Plugin verwendet es jedoch nicht, sodass keine Ausführungsdatendatei vorhanden ist.

jpl
quelle
0

Versuchen zu benutzen:

mvn jacoco:report -debug

um die Details zu Ihrem Berichtsprozess anzuzeigen.

Ich habe meinen Jacoco folgendermaßen konfiguriert:

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

Dann mvn jacoco:report -debugzeigt es die Standardkonfiguration verwenden, die Mittel jacoco.execnicht in ~/jacoco.exec. Der Fehler sagt missing execution data file.

Verwenden Sie einfach die Standardkonfiguration:

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

Und alles funktioniert gut.

xiaoLiuLiu
quelle
0

Manchmal wird die Ausführung zum ersten Mal ausgeführt, und wenn wir eine Maven-Neuinstallation durchführen, wird sie danach nicht generiert. Das Problem war die Verwendung von true für skipMain und die Eigenschaften skip unter dem Maven-Compiler-Plugin der Haupt-POM-Datei. Entfernen Sie sie, wenn sie als Teil eines Problems oder Vorschlags eingeführt wurden.

Srini M.
quelle
0

In meinem Fall hatte der Vorbereitungsagent eine andere destFileKonfiguration, aber dementsprechend musste der Bericht mit einem konfiguriert werden dataFile, aber diese Konfiguration fehlte. Sobald das dataFilehinzugefügt wurde, fing es an, gut zu funktionieren.

Pavan Kumar
quelle