Отримання "Пропуск виконання JaCoCo через відсутність файлу даних про виконання" при виконанні JaCoCo


123

Я використовую Maven 3.0.3, JUnit 4.8.1 та Jacoco 0.6.3.201306030806, і я намагаюся створити звіти про тестові покриття.

У мене є проект лише з тестовими одиницями, але я не можу запускати звіти, я не раз отримую помилку: Skipping JaCoCo execution due to missing execution data fileколи я запускаю:

mvn clean install -P test-coverage

Ось як налаштовано мій пом:

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

Всі мої тести проходять успішно. Ось деякі з результатів 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] 

Будь-які ідеї, якої конфігурації мені не вистачає?



Здається, у вас також є інтеграційні тести на пом, які можуть бути відволікаючими. Крім того, ми зняли destFileфайл і дозволили йому записати у файл target / jacoco.exec за замовчуванням.
MarkHu

Я опублікував відповідь у цьому місці.
Shivkumar Kawtikwar

Відповіді:


135

jacoco-maven-plugin: 0.7.10-SNAPSHOT

Від jacoco: препарат-препарат, який говорить:

Один із способів зробити це у випадку плагін maven-surefire - це використовувати синтаксис для пізньої оцінки властивостей:

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

Зауважте, @{argLine}що додано до -your -extra -arguments.

Дякую Славі Семушин за те, що помітив зміни та повідомив у коментарі .

jacoco-maven-plugin: 0.7.2-SNAPSHOT

Слідом за джакоко: препарат-препарат, який говорить:

[Org.jacoco: jacoco-Maven-плагін: 0.7.2-снапшотов: підготовка агент] Готує властивості , що вказує на час виконання агента JaCoCo , який може бути переданий в якості аргументу VM до застосування при випробуванні. Залежно від типу упаковки проекту за замовчуванням встановлюється властивість із таким ім'ям:

  • tycho.testArgLine для упаковки типу eclipse-test-plugin та
  • argLine в іншому випадку.

Зауважте, що ці властивості не повинні бути перезаписані тестовою конфігурацією, інакше агент JaCoCo не може бути приєднаний. Якщо вам потрібні спеціальні параметри, додайте їх. Наприклад:

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

Отримана інформація про покриття збирається під час виконання і за замовчуванням записується у файл, коли процес припиняється.

слід змінити наступний рядок у maven-surefire-pluginконфігурації плагіну (зверніть увагу на ${argLine}внутрішню частину <argLine>):

<argLine>-Xmx2048m</argLine>

до

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

Внесіть також необхідні зміни в інший плагін maven-failsafe-pluginі замініть наступні (знову ж таки, зверніть увагу ${argLine}):

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

до

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

Однак, у цьому є ця проблема, без цілі на jacoco, збірка не вдається.
Андреас

Працював, але мені довелося використовувати tycho.testArgLine, оскільки я використовую tycho.
Раффі Хатчадоуріан

1
Цитується посилання тепер має дещо іншу пропозицію використовувати @{argLine}.
Слава Семушин

2
Саме це було моїм питанням. У мене були власні аргументи в команді mvn mvn clean package sonar:sonar -U -DargLine="-Dxxx=yyy". Я не декларую плагін Maven-surefire явно та встановлюю конфігурації. Я просто додаю заповнювач argLine в командний рядок Maven, як mvn clean package sonar:sonar -U -DargLine="@{argLine} -Dxxx=yyy". Тепер генерується файл jacoco.exec і генерується звіт про покриття в сонарі.
RenatoIvancic

1
Це працює !!! Проблема була пов’язана з конфігурацією <argLine>, яку я додав у плагін maven-surefire, щоб збільшити пам'ять для інтеграційних тестів Налаштування <argLine> $ {argLine} --my - додаткові аргументи - тут-- </ argLine > вирішили проблему
Массімо Да Рос

23

Я стикався з іншою проблемою, яка повернула ту саму помилку.

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

Правда така помилка повертається з багатьох, багатьох причин. Ми експериментували з різними рішеннями щодо переповнення стека, але визнали цей ресурс найкращим. Це вириває безліч різних потенційних причин, чому Якоко міг повернути ту саму помилку.

Для нас рішенням було додати готовий агент до конфігурації.

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

Я думаю, що більшість користувачів відчують це з різних причин, тому погляньте на вищезгаданий ресурс!


2
Я думаю, ти це прибив. Люди можуть google це для "швидкого виправлення", але найбільш правильною відповіддю було б "Правда, ця помилка повертається з багатьох, багатьох причин". Просто потрібно з’ясувати, що це таке. Для мене це був батьківський пом, який перезаписав <argLine> у плагін maven-surefire.
tuan.dinh

Це! Дякую. Я отримав те саме повідомлення, але це було тому, що мій плагін- **/*Test.java*Tests.java
Роджер

У мене були дві проблеми: 1. Жодних тестових класів не потрібно, принаймні один *Test.javaклас, і один метод тестування, який @Testпозначається, щоб Jacoco міг щось зробити. 2. У змінному середовищі Травіса для мого проекту, який був друком SONART_TOKEN=*****, слід було б назвати SONAR_TOKEN=*****. Дивіться документи Travis тут , шукайте or define SONAR_TOKEN in your Repository Settings. Після того як я це зафіксував, збірка успішно працювала. Ви можете переглянути мій проект gitbhub .
Хосе Кіджада

16

Може виникнути випадок, коли деякі інші налаштування аргументів або плагін у pom можуть перекривати налаштування порядку виконання jacoco.

argLine встановлено на -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

Один із прикладів

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

Після позбавлення від argLine з цих плагінів, jacoco почав нормально працювати.


Вирішив мою проблему. Чудове місце!
користувач1974753

13

Також можна отримати помилку "Пропуск виконання JaCoCo через відсутність файлу даних про виконання" через відсутність тестів у проекті. Наприклад, коли ви запускаєте новий проект і не маєте файлів * Test.java взагалі.


5

Що сказав tdrury:

змініть свою конфігурацію плагіна на цю:

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

Редагувати: Щойно помітив одну важливу річ, destFile та dataFile здаються чутливими до регістру, тому це має бути destFile, а не destfile.


5

Я знаю, що це питання досить старе, але якщо хтось, як я, приходить сюди, шукаючи відповіді, то це може допомогти. Мені вдалося подолати вищевказану помилку за допомогою цього.

1) Видаліть наведений нижче фрагмент коду з плагіна maven-surefire-плагін

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

2) Додайте нижченаведену мету:

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

3

Зустрічався з тією ж проблемою саме зараз.

У мене є клас з іменем HelloWorld, і я створив тестовий клас для нього з назвою HelloWorldTests, тоді я отримав вихідSkipping JaCoCo execution due to missing execution data file.

Потім я спробував змінити свою, pom.xmlщоб вона працювала, але спроба не вдалася.

Нарешті, я просто перейменувати HelloWorldTestsв HelloWorldTest, і це спрацювало!

Тому я здогадуюсь, що за замовчуванням jacoco розпізнає лише тестовий клас з назвою like XxxTest, що вказує, що це тестовий клас для Xxx. Тож просто перейменуйте свої тестові класи у цей формат має працювати!


2

Я спробував усі відповіді, але для мене спрацювала лише наступна комбінація порад. Чому? У мене були дуже специфічні вимоги:

  1. JaCoCo створює звіт, коли збірка запускається з командного рядка: mvn clean verify(Maven 3.6.0)
  2. Intellij IDEA (2019.01) також проводить мої тести
  3. Все це працює за наявності іншого, javaagentвизначеного в surefireплагіні

Рішення - додавати argLineзначення в surefireконфігурації з властивістю Maven "із запізненням на заміну", @{...}як пояснено в surefire FAQ ( моя фіксована конфігурація )

Як я можу використовувати властивості, встановлені іншими плагінами в argLine? Maven робить заміну майна для

Значення $ {...} у pom.xml перед запуском будь-якого плагіна. Тож Surefire ніколи не побачить власників місць у власності argLine. Оскільки Версія 2.17 використовує альтернативний синтаксис для цих властивостей,

@ {...} дозволяє пізню заміну властивостей, коли плагін виконується, тому властивості, модифіковані іншими плагінами, будуть вибрані правильно.

Не вдалося першої спроби - визначити властивість jaCoCoArgLine в prepare-agentконфігурації цілі jacoco- сценарій не виконав мою другу вимогу, IntelliJ IDEA не зміг розібратися з агентом для jmockit, який я використовую в проекті для статичного методу глузування


Зіткнувся з тією ж проблемою під час використання з JMockit і зміг вирішити проблему з цим рішенням. тобто додавання argLine в плагін-версію
Karthik Rao

1

Я додав проект Maven / Java з класом 1 Domain з такими функціями:

  • Тестування блоку або інтеграції за допомогою плагінів Surefire та Failsafe.
  • Findbugs.
  • Тестове покриття через Jacoco .

Де результати Якоко? Після тестування та запуску програми «mvn clean» ви можете знайти результати у «target / site / jacoco / index.html». Відкрийте цей файл у браузері.

Насолоджуйтесь!

Я намагався зробити проект максимально простим. Проект об'єднує багато пропозицій з цих постів у прикладі проекту. Дякую, дописувачі!


Я спробував ваш git-проект, але незрозуміло, як бачити звіт.
Нагарай Віттал

Де результати Якоко? Після тестування та запуску програми «mvn clean» ви можете знайти результати у «target / site / jacoco / index.html». Відкрийте цей файл у браузері.
tm1701

Ви можете зв’язати свій сховище назад до stackoverflow. Мені важко було знову знайти питання після того, як я знайшов помилку у вашій демонстрації.
Вольфганг Фал

І досі не працює так, як очікувалося :-( в цільовому каталозі є лише
agregate.exec,

1

Я боровся цілими днями. Я спробував усі різні конфігурації, запропоновані в цій темі. Жоден з них не працює. Нарешті, я знаходжу лише важливою конфігурацією є мета препарату . Але ви повинні поставити це в потрібній фазі. Я бачив так багато прикладів, які містять це у " тесті перед інтеграцією ", це вводить в оману, оскільки він буде виконаний лише після тестування одиниць. Таким чином, тестовий пристрій не буде зафіксовано.

Правий конфігуратор повинен просто використовувати фазу за замовчуванням (фазу не вказуйте прямо). І зазвичай вам не потрібно збиратися навколо плагіну Maven-surefire .

  <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

Виконання говорить про те, що вона містить дані jacoco в /Users/davea/Dropbox/workspace/myproject/target/jacoco.exec, але ваша конфігурація Maven шукає дані в $ {basedir} / target / покриття-звіти / jacoco-unit. виконувати


1
Правильно, так чому плагін ігнорує те, що я вказав у конфігурації?
Дейв

спробуйте перенести конфігурацію файлу призначення у конфігурацію виконання агента підготовки. Не всі модулі Maven витончено обробляють спадщину конфігурації.
tdrury

0

Моя відповідь дуже пізня, але для інших користувачів У вашому випадку вам доведеться налаштувати помилкове підключення, щоб використовувати конфігурацію агента командного рядка, збережену в змінній itCoverageAgent. Для прикладу

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

У вашій конфігурації Maven, jacoco готує аргументи командного рядка у фазі підготовки-агента, але плагін-безпечний плагін не використовує його, тому немає файлу даних про виконання.


0

Спробуйте використовувати:

mvn jacoco:report -debug

щоб побачити деталі про ваш процес звітування.

Я налаштував так, як таке:

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

Потім mvn jacoco:report -debugпоказує це, використовуючи конфігурацію за замовчуванням, а значить jacoco.exec, не в ~/jacoco.exec. Помилка говорить missing execution data file.

Тому просто використовуйте конфігурацію за замовчуванням:

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

І все працює добре.


0

Іноді виконання виконується вперше, і коли ми робимо Maven clean встановлення, воно не генерується після цього. Проблема полягає у використанні true для skipMain та пропуск властивостей під maven-компілятором-плагіном головного файлу Pom. Видаліть їх, якщо вони були представлені як частина будь-якого питання чи пропозиції.


0

У моєму випадку агент підготовки мав іншу destFileконфігурацію, але відповідно звіт мав бути налаштований з а dataFile, але ця конфігурація відсутня. Як тільки dataFileбуло додано, воно почало працювати нормально.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.