Uzyskanie komunikatu „Pomijanie wykonania JaCoCo z powodu braku pliku danych wykonania” po uruchomieniu JaCoCo

123

Używam Maven 3.0.3, JUnit 4.8.1 i Jacoco 0.6.3.201306030806 i próbuję utworzyć raporty pokrycia testów.

Mam projekt tylko z testami jednostkowymi, ale nie mogę uzyskać raportów do uruchomienia, wielokrotnie otrzymuję błąd: Skipping JaCoCo execution due to missing execution data filekiedy uruchamiam:

mvn clean install -P test-coverage

Oto jak skonfigurowany jest mój 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>

Wszystkie moje testy przebiegły pomyślnie. Oto niektóre wyniki Mavena:

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

Jakieś pomysły jakiej konfiguracji mi brakuje?

Dave
źródło
Wygląda na to, że masz również testy integracji w pompie, co może rozpraszać uwagę. Ponadto, odpędza się z destFilei niech napisać do domyślnego docelowego pliku / jacoco.exec.
MarkHu
Wysłałem odpowiedź w tej lokalizacji.
Shivkumar Kawtikwar

Odpowiedzi:

135

jacoco-maven-plugin: 0.7.10-SNAPSHOT

Od jacoco: agent przygotowawczy, który mówi:

Jednym ze sposobów na to w przypadku maven-surefire-plugin - jest użycie składni do późnej oceny właściwości:

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

Zwróć uwagę na @{argLine}to, co zostało dodane do -your -extra -arguments.

Dziękuję Slavie Semushinowi za zauważenie zmiany i zgłoszenie w komentarzu .

jacoco-maven-plugin: 0.7.2-SNAPSHOT

Podążając za Jacoco: przygotuj-agent, który mówi:

[org.jacoco: jacoco-maven-plugin: 0.7.2-SNAPSHOT: preparat-agent] Przygotowuje właściwość wskazującą na agenta środowiska wykonawczego JaCoCo, który można przekazać jako argument maszyny wirtualnej do testowanej aplikacji. W zależności od typu opakowania projektu domyślnie ustawiana jest właściwość o następującej nazwie:

  • tycho.testArgLine do pakowania typu eclipse-test-plugin oraz
  • argLine inaczej.

Należy pamiętać, że te właściwości nie mogą zostać nadpisane przez konfigurację testową, w przeciwnym razie nie będzie można podłączyć agenta JaCoCo. Jeśli potrzebujesz parametrów niestandardowych, dołącz je. Na przykład:

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

Wynikowe informacje o pokryciu są gromadzone podczas wykonywania i domyślnie zapisywane w pliku po zakończeniu procesu.

powinieneś zmienić następujący wiersz w maven-surefire-pluginkonfiguracji wtyczki z (zwróć uwagę na ${argLine}wnętrze <argLine>):

<argLine>-Xmx2048m</argLine>

do

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

Dokonaj również niezbędnych zmian w drugiej wtyczce maven-failsafe-plugini zamień następujące (ponownie zwróć uwagę na ${argLine}):

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

do

<argLine>${argLine} -Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>
Jacek Laskowski
źródło
Teraz jednak jest ten problem, bez celu jacoco kompilacja się nie udaje.
Andreas
Pracowałem, ale musiałem korzystać z tycho.testArgLine, ponieważ używam tycho.
Raffi Khatchadourian
1
Cytowany link ma teraz nieco inną sugestię do użycia @{argLine}.
Slava Semushin
2
Dokładnie to był mój problem. Miałem niestandardowe argumenty w komendzie mvn mvn clean package sonar:sonar -U -DargLine="-Dxxx=yyy". Nie deklaruję jawnie wtyczki maven-surefire-plugin i nie ustawiam konfiguracji. Po prostu dodaję symbol zastępczy argLine w wierszu poleceń maven, jak mvn clean package sonar:sonar -U -DargLine="@{argLine} -Dxxx=yyy". Teraz generowany jest plik jacoco.exec, a sonar generuje raport pokrycia.
RenatoIvancic,
1
To działa !!! Problem był spowodowany konfiguracją <argLine>, którą dodałem na maven-surefire-plugin w celu zwiększenia pamięci dla testów integracji Konfigurowanie <argLine> $ {argLine} --my - additional-arguments - here-- </ argLine > rozwiązałem problem
Massimo Da Ros
23

Napotkałem nieco inny problem, który zwrócił ten sam błąd.

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

Prawda jest taka, że ​​ten błąd powraca z wielu, wielu powodów. Eksperymentowaliśmy z różnymi rozwiązaniami w Stack Overflow, ale stwierdziliśmy, że ten zasób jest najlepszy. To obala wiele różnych potencjalnych powodów, dla których Jacoco może zwrócić ten sam błąd.

Dla nas rozwiązaniem było dodanie do konfiguracji agenta przygotowującego.

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

Wyobrażam sobie, że większość użytkowników będzie tego doświadczać z różnych powodów, więc spójrz na wspomniany zasób!

Chad Van De Hey
źródło
2
Myślę, że udało ci się to. Ludzie mogą go wygooglować w poszukiwaniu „szybkiej naprawy”, ale najbardziej poprawna odpowiedź brzmi: „Prawda jest taka, że ​​ten błąd powraca z wielu, wielu powodów”. Po prostu muszę się dowiedzieć, co to jest. Dla mnie był to macierzysty pom nadpisujący <argLine> we wtyczce maven-surefire-plugin.
tuan.dinh
To! Dzięki. Otrzymałem tę samą wiadomość, ale to dlatego, że moja pewna wtyczka szukała tylko plików nazwanych, **/*Test.javagdy moje klasy testowe zostały nazwane*Tests.java
Roger Worrell
Miałem dwa problemy: 1. Żadnych klas testowych, potrzeba co najmniej jednej *Test.javaklasy i jednej metody testowej z adnotacją, @Testaby Jacoco mógł coś zrobić. 2. W Travisie zmienne środowiskowe mojego projektu, które miały literówkę SONART_TOKEN=*****, powinny zostać nazwane SONAR_TOKEN=*****. Zobacz dokumentację Travisa tutaj , wyszukaj or define SONAR_TOKEN in your Repository Settings. Po naprawieniu kompilacja przebiegła pomyślnie. Możesz zobaczyć mój projekt gitbhub, o którym mowa .
Jose Quijada
16

Może się zdarzyć, że jakaś inna konfiguracja argline lub wtyczka w pom może nadpisywać konfigurację zlecenia wykonania jacoco.

argLine ustawione na -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

Jeden z przykładów

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

Po pozbyciu się argLine z tych wtyczek, jacoco zaczął normalnie działać.

Atish Narlawar
źródło
Rozwiązał mój problem. Świetne miejsce!
user1974753
13

Można również otrzymać błąd „Pomijanie wykonania JaCoCo z powodu braku pliku danych wykonawczych” z powodu braku testów w projekcie. Na przykład, gdy uruchamiasz nowy projekt i nie masz żadnych plików * Test.java.

Tanya Jivvca
źródło
5

F Co powiedział tdrury:

zmień konfigurację wtyczki na następującą:

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

Edycja: Właśnie zauważyłem jedną ważną rzecz, destFile i dataFile wydają się rozróżniać wielkość liter, więc powinno to być destFile, a nie destfile.

BoneGoat
źródło
5

Wiem, że to pytanie jest dość stare, ale jeśli ktoś taki jak ja przyjdzie tutaj w poszukiwaniu odpowiedzi, może to pomóc. Dzięki temu udało mi się przezwyciężyć powyższy błąd.

1) Usuń poniższy fragment kodu z wtyczki maven-surefire-plugin

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

2) Dodaj poniższy cel:

<execution>
<id>default-prepare-agent</id>
<goals>
   <goal>prepare-agent</goal>
</goals>
</execution>
Zawsze nowy klient
źródło
3

Właśnie dotarłem do tego samego problemu.

Mam klasę o nazwie HelloWorldi utworzyłem dla niej klasę testową o nazwie HelloWorldTests, a następnie otrzymałem wynikSkipping JaCoCo execution due to missing execution data file.

Następnie próbowałem zmienić mój, pom.xmlaby działał, ale próba się nie powiodła.

Wreszcie po prostu zmieniam nazwę HelloWorldTestsna HelloWorldTesti zadziałało!

Więc myślę, że domyślnie , jacoco rozpoznaje tylko klasę testową nazwie jak XxxTest, co wskazuje, że jest to test dla klasy Xxx. Po prostu zmień nazwy klas testowych na ten format, który powinien działać!

afkbrb
źródło
2

Wypróbowałem wszystkie odpowiedzi, ale zadziałała tylko następująca kombinacja porad. Czemu? Miałem bardzo specyficzne wymagania:

  1. JaCoCo generuje raport, gdy kompilacja jest uruchamiana z wiersza poleceń: mvn clean verify(Maven 3.6.0)
  2. Intellij IDEA (2019.01) również przeprowadza moje testy
  3. Wszystko działa w obecności innej javaagentzdefiniowanej we surefirewtyczce

Rozwiązanie - dołącz argLinewartość w surefirekonfiguracji za pomocą właściwości maven „późnej wymiany”, @{...}jak wyjaśniono w surefire FAQ ( moja stała konfiguracja )

Jak używać właściwości ustawionych przez inne wtyczki w argLine? Maven zastępuje majątek

$ {...} wartości w pom.xml przed uruchomieniem jakiejkolwiek wtyczki. Tak więc Surefire nigdy nie zobaczyłby symboli zastępczych w swojej właściwości argLine. Od wersji 2.17 używającej alternatywnej składni dla tych właściwości,

@ {...} umożliwia późną zamianę właściwości podczas wykonywania wtyczki, dzięki czemu właściwości zmodyfikowane przez inne wtyczki zostaną poprawnie pobrane.

Nieudana pierwsza próba - zdefiniuj właściwość jaCoCoArgLine w prepare-agentkonfiguracji celu jacoco- scenariusz nie spełnił mojego drugiego wymagania, IntelliJ IDEA nie mógł znaleźć agenta dla jmockit, którego używam w projekcie do mockowania metod statycznych

Paweł Kruszewski
źródło
Napotkał ten sam problem podczas korzystania z JMockit i był w stanie rozwiązać problem za pomocą tego rozwiązania. czyli dodanie argLine w pewnej wtyczce
Karthik Rao
1

Dodałem projekt Maven / Java z 1 klasą domeny z następującymi funkcjami:

  • Testowanie jednostkowe lub integracyjne za pomocą wtyczek Surefire i Failsafe.
  • Findbugs.
  • Pokrycie testowe przez Jacoco .

Gdzie są wyniki Jacoco? Po przetestowaniu i uruchomieniu „mvn clean” wyniki można znaleźć w „target / site / jacoco / index.html”. Otwórz ten plik w przeglądarce.

Cieszyć się!

Starałem się, aby projekt był jak najprostszy. Projekt łączy wiele sugestii z tych postów w przykładowym projekcie. Dziękuję, współautorzy!

tm1701
źródło
Wypróbowałem twój projekt git, ale nie jest jasne, jak zobaczyć raport.
Nagaraj Vittal
Gdzie są wyniki Jacoco? Po przetestowaniu i uruchomieniu „mvn clean” wyniki można znaleźć w „target / site / jacoco / index.html”. Otwórz ten plik w przeglądarce.
tm1701
Możesz chcieć połączyć swoje repozytorium z powrotem do stackoverflow. Trudno mi było znaleźć to pytanie ponownie po tym, jak znalazłem błąd w twoim demo.
Wolfgang Fahl
I nadal nie działa zgodnie z oczekiwaniami :-( katalog docelowy ma tylko agregat.exec, ponieważ jego zawartość podczas wykonywania czystej instalacji mvn ...
Wolfgang Fahl
1

Walczyłem przez wiele dni. Wypróbowałem wszystkie różne konfiguracje sugerowane w tym wątku. Żaden z nich nie działa. Wreszcie uważam, że tylko ważna konfiguracja jest celem przygotowania agenta . Ale musisz umieścić to we właściwej fazie. Widziałem tak wiele przykładów umieszczających go w „ teście przed integracją ”, co jest mylące, ponieważ zostanie wykonany dopiero po teście jednostkowym. Więc test jednostkowy nie będzie instrumentowany.

Właściwa konfiguracja powinna po prostu używać domyślnej fazy (nie określaj fazy jawnie). I zwykle nie musisz gromadzić się wokół wtyczki 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
źródło
0

Wykonanie mówi, że umieszcza dane jacoco w /Users/davea/Dropbox/workspace/myproject/target/jacoco.exec, ale twoja konfiguracja maven szuka danych w $ {basedir} / target / zasięg-raporty / jacoco-jednostka. exec.

tdrury
źródło
1
Tak, dlaczego więc wtyczka ignoruje to, co określam w konfiguracji?
Dave
spróbuj przenieść konfigurację destfile do konfiguracji wykonania agent-przygotowanie. Nie wszystkie wtyczki Mavena łaskawie obsługują dziedziczenie konfiguracji.
tdrury
0

Moja odpowiedź jest bardzo późna, ale dla innych użytkowników W twoim przypadku musisz skonfigurować bezpieczne podłączanie, aby używać konfiguracji agenta wiersza poleceń zapisanej w zmiennej itCoverageAgent. Na przykład

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

W twojej konfiguracji Mavena jacoco przygotowuje argumenty wiersza poleceń w fazie przygotowania agenta, ale bezpieczna wtyczka nie używa go, więc nie ma pliku danych wykonania.

jpl
źródło
0

Spróbuj użyć:

mvn jacoco:report -debug

aby zobaczyć szczegóły dotyczące procesu raportowania.

Skonfigurowałem moje jacoco w ten sposób:

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

Następnie mvn jacoco:report -debugpokazuje go przy użyciu domyślnej konfiguracji, co oznacza, że jacoco.execnie ma go w programie ~/jacoco.exec. Błąd mówi missing execution data file.

Po prostu użyj domyślnej konfiguracji:

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

I wszystko działa dobrze.

xiaoLiuLiu
źródło
0

Czasami wykonanie jest uruchamiane za pierwszym razem, a kiedy wykonujemy maven czystą instalację, nie generuje się później. Problem polegał na używaniu true dla właściwości skipMain i skip w wtyczce maven-compiler-plugin głównego pliku pom. Usuń je, jeśli zostały wprowadzone jako część problemu lub sugestii.

Srini M
źródło
0

W moim przypadku agent przygotowania miał inną destFilekonfigurację, ale odpowiednio raport musiał być skonfigurowany z dataFile, ale tej konfiguracji brakowało. Po dataFiledodaniu zaczął działać dobrze.

Pavan Kumar
źródło