Получение «Пропуск выполнения 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
Я отправил ответ по этому адресу .
Шивкумар Кавтиквар

Ответы:

135

jacoco-Maven-плагин: 0.7.10-SNAPSHOT

От jacoco: подготовить агент, который говорит:

Один из способов сделать это в случае maven-surefire-plugin - использовать синтаксис для поздней оценки свойств:

<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-плагин: 0.7.2-SNAPSHOT

После jacoco: приготовить агент, который говорит:

[org.jacoco: jacoco-maven-plugin: 0.7.2-SNAPSHOT: prepare-agent] Подготавливает свойство, указывающее на агент времени выполнения JaCoCo, которое может быть передано в качестве аргумента виртуальной машины тестируемому приложению. В зависимости от типа упаковки проекта по умолчанию устанавливается свойство со следующим именем:

  • 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-plugin явно и не устанавливаю конфигурации. Я просто добавляю заполнитель argLine в командную строку maven, например mvn clean package sonar:sonar -U -DargLine="@{argLine} -Dxxx=yyy". Теперь создается файл jacoco.exec и в сонаре создается отчет о покрытии.
RenatoIvancic 09
1
Оно работает !!! Проблема возникла из-за конфигурации <argLine>, которую я добавил в maven-surefire-plugin, чтобы увеличить память для интеграционных тестов. Настройка <argLine> $ {argLine} --my - additional-arguments - здесь - </ argLine > Проблема решена
Массимо Да Рос
23

Я столкнулся с немного другой проблемой, которая вернула ту же ошибку.

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

По правде говоря, эта ошибка возвращается по многим-многим причинам. Мы экспериментировали с различными решениями на Stack Overflow, но сочли этот ресурс лучшим. Это разрушает множество различных потенциальных причин, по которым Жакоко может возвращать ту же ошибку.

Для нас решением было добавить в конфигурацию подготовительный агент.

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

Я предполагаю, что большинство пользователей испытают это по разным причинам, поэтому взгляните на вышеупомянутый ресурс!

Чад Ван Де Хей
источник
2
Я думаю, ты справился. Люди могут найти ее в Google для «быстрого исправления», но наиболее правильным ответом будет «Правда в том, что эта ошибка возвращается по многим, многим причинам». Просто нужно узнать, что это такое. Для меня это был родительский pom, перезаписывающий <argLine> в maven-surefire-plugin.
tuan.dinh
Это! Спасибо. Я получил то же сообщение, но это произошло потому, что мой плагин surefire искал только файлы, названные в то время, **/*Test.javaкогда были названы мои тестовые классы*Tests.java
Роджер Уоррелл
У меня было две проблемы: 1. Никаких тестовых классов, нужен хотя бы один *Test.javaкласс и один тестовый метод, @Testпомеченный, чтобы Джакоко мог что-то делать. 2. Переменные среды Travis для моего проекта, в которых была опечатка SONART_TOKEN=*****, должны были быть названы SONAR_TOKEN=*****. См. Здесь документы Travis, выполните поиск по запросу or define SONAR_TOKEN in your Repository Settings. После того, как я это исправил, сборка прошла успешно. Вы можете просмотреть мой проект на gitbhub, о котором идет речь .
Jose Quijada
16

Возможен случай, когда какая-либо другая настройка argline или плагин в 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 стал нормально работать.

Атиш Нарлавар
источник
Решил мою проблему. Отличное место!
user1974753
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.

BoneGoat
источник
5

Я знаю, что этот вопрос довольно старый, но если кто-то вроде меня придет сюда в поисках ответа, это может помочь. Я смог преодолеть указанную выше ошибку.

1) Удалите приведенный ниже фрагмент кода из плагина maven-surefire-plugin

 <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. Так что просто переименуйте свои тестовые классы в этот формат, чтобы работать!

afkbrb
источник
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 в плагин surefire
Картик Рао
1

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

  • Модульное или интеграционное тестирование с помощью плагинов Surefire и Failsafe.
  • FindBugs.
  • Тестовое покрытие через Jacoco .

Где результаты Жакоко? После тестирования и запуска «mvn clean» вы можете найти результаты в «target / site / jacoco / index.html». Откройте этот файл в браузере.

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

Я старался сделать проект максимально простым. Проект объединяет множество предложений из этих сообщений в пример проекта. Спасибо, участники!

tm1701
источник
Я пробовал ваш проект git, но неясно, как посмотреть отчет.
Нагарадж Виттал
Где результаты Жакоко? После тестирования и запуска «mvn clean» вы можете найти результаты в «target / site / jacoco / index.html». Откройте этот файл в браузере.
tm1701
Возможно, вы захотите снова связать свой репозиторий с stackoverflow. Мне было трудно снова найти вопрос после того, как я обнаружил ошибку в вашей демонстрации.
Wolfgang
И все равно не работает должным образом :-( в целевом каталоге есть только aggregate.exec, поскольку он содержится при выполнении mvn clean install ...
Вольфганг
1

Я боролся несколько дней. Я пробовал все различные конфигурации, предложенные в этой теме. Ни один из них не работает. Наконец, я считаю, что только важная конфигурация - это цель агента подготовки . Но вы должны поместить это в правильную фазу. Я видел так много примеров, помещающих его в « предварительный интеграционный тест », что вводит в заблуждение, так как он будет выполнен только после модульного теста. Таким образом, модульный тест не будет инструментирован.

Правильная конфигурация должна просто использовать фазу по умолчанию (не указывайте фазу явно). И обычно вам не нужно копаться в 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>
Цзяньву Чен
источник
0

При выполнении говорится, что данные jacoco помещаются в /Users/davea/Dropbox/workspace/myproject/target/jacoco.exec, но ваша конфигурация maven ищет данные в $ {basedir} / target / cover-reports / jacoco-unit. Отв.

tdrury
источник
1
Так почему же плагин игнорирует то, что я указываю в конфигурации?
Дэйв
попробуйте переместить конфигурацию файла destfile в конфигурацию выполнения агента подготовки. Не все плагины maven корректно обрабатывают наследование конфигурации.
tdrury 09
0

Мой ответ очень запоздал, но для других пользователей. В вашем случае вам необходимо настроить отказоустойчивое подключение, чтобы использовать конфигурацию агента командной строки, сохраненную в переменной itCoverageAgent. Например

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

В вашей конфигурации maven jacoco подготавливает аргументы командной строки на этапе подготовки агента, но отказоустойчивый плагин не использует его, поэтому файл данных выполнения отсутствует.

JPL
источник
0

Попробуй использовать:

mvn jacoco:report -debug

чтобы увидеть подробную информацию о вашем процессе отчетности.

Я сконфигурировал свой jacoco так:

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

И все отлично работает.

xiaoLiuLiu
источник
0

Иногда выполнение запускается в первый раз, и когда мы выполняем чистую установку maven, после этого он не генерируется. Проблема заключалась в использовании true для свойств skipMain и skip в maven-compiler-plugin основного файла pom. Удалите их, если они были представлены как часть какой-либо проблемы или предложения.

Срини М
источник
0

В моем случае агент подготовки имел другую destFileконфигурацию, но, соответственно, отчет должен был быть настроен с помощью dataFile, но эта конфигурация отсутствовала. Как только dataFileбыл добавлен, он начал работать нормально.

Паван Кумар
источник