Получение "Пропуска выполнения JaCoCo из-за отсутствия файла данных выполнения" при выполнении JaCoCo
Я использую 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]
Есть идеи, какая конфигурация мне не хватает?
Ответы
Ответ 1
jacoco-Maven-плагин: 0.7.10-ПАНОРАМА
Из jacoco: prepare-agent, который гласит:
Один из способов сделать это в случае 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: prepare-agent, в котором говорится:
[org.jacoco: jacoco-maven-plugin: 0.7.2-SNAPSHOT: agent-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>
Ответ 2
Я столкнулся с другой проблемой, которая вызвала ту же ошибку.
Skipping JaCoCo execution due to missing execution data /target/jacoco.exec
Правда в том, что эта ошибка возвращается по многим, многим причинам. Мы экспериментировали с различными решениями по переполнению стека, но нашли этот ресурс лучшим. Это разрушает множество возможных причин, по которым Jacoco может возвращать ту же ошибку.
Для нас решением было добавить в конфигурацию агент подготовки.
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
Я предполагаю, что большинство пользователей будут испытывать это по разным причинам, поэтому взгляните на вышеупомянутый ресурс!
Ответ 3
Может случиться так, что некоторые другие установки или плагины в 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 начал нормально работать.
Ответ 4
Можно также получить сообщение об ошибке "Пропуск JaCoCo из-за отсутствия файла данных выполнения" из-за отсутствия тестов в проекте. Например, когда вы запускаете новый проект и не имеете никаких файлов * Test.java вообще.
Ответ 5
FWhat сказал 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.
Ответ 6
Я знаю, что этот вопрос довольно старый, но если кто-то вроде меня приходит сюда, ища ответ, это может помочь. Я смог преодолеть вышеупомянутую ошибку с этим.
1) Удалите нижнюю часть кода из плагина maven-surefire-plugin
<reuseForks>true</reuseForks>
<argLine>-Xmx2048m</argLine>
2) Добавьте следующую цель:
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
Ответ 7
Я добавил проект Maven/Java с 1 классом домена со следующими функциями:
- Модульное или интеграционное тестирование с помощью плагинов Surefire и Failsafe.
- FindBugs.
- Тестовое покрытие через Jacoco.
Где результаты Jacoco? После тестирования и запуска mvn clean вы можете найти результаты в target/site/jacoco/index.html. Откройте этот файл в браузере.
Наслаждайтесь!
Я старался сделать проект максимально простым. Проект объединяет множество предложений из этих постов в пример проекта. Спасибо, участники!
Ответ 8
Выполнение говорит, что он помещает данные jacoco в /Users/davea/Dropbox/workspace/myproject/target/jacoco.exec, но ваша конфигурация maven ищет данные в ${basedir}/target/coverage-reports/jacoco -unit.exec.
Ответ 9
Мой ответ очень поздний, но для других пользователей
В вашем случае вам нужно настроить отказоустойчивый подключаемый модуль, чтобы использовать конфигурацию агента командной строки, сохраненную в переменной itCoverageAgent.
Например,
<configuration>
<argLine>${itCoverageAgent}</argLine>
</configuration>
В вашей конфигурации maven jacoco подготавливает аргументы командной строки в фазе подготовки-агента, но отказоустойчивый плагин не использует его, поэтому нет файла данных выполнения.
Ответ 10
Попробуй использовать:
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>
И все работает отлично.
Ответ 11
Иногда выполнение запускается в первый раз, и когда мы делаем чистую установку maven, она не генерируется после этого. Проблема заключалась в использовании true для свойств skipMain и skip в maven-compiler-plugin основного файла pom. Удалите их, если они были представлены как часть какой-либо проблемы или предложения.
Ответ 12
Причины, из-за которых исполняемые файлы данных не создаются, находятся в этом месте.
Ответ 13
Я перепробовал все ответы, но мне помогло только следующее сочетание советов. Зачем? У меня были очень конкретные требования:
- JaCoCo генерирует отчет при запуске сборки из командной строки:
mvn clean verify
(Maven 3.6.0) - Intellij IDEA (2019.01) также запускает мои тесты
- Это все работает в присутствии другого
javaagent
, определенные в surefire
плагин
Решение - добавьте значение argLine
в surefire
конфигурации с помощью свойства maven "поздняя замена" @{...}
как описано в surefire
FAQ (моя фиксированная конфигурация)
Как использовать свойства, установленные другими плагинами в argLine? Maven делает замену имущества для
$ {...} значений в pom.xml перед запуском любого плагина. Таким образом, Surefire никогда не увидит заполнителей в свойстве argLine. Начиная с версии 2.17, использующей альтернативный синтаксис для этих свойств,
@{...} допускает позднюю замену свойств при запуске плагина, поэтому свойства, которые были изменены другими плагинами, будут выбраны правильно.
Первая попытка не удалась - определите свойство jaCoCoArgLine в конфигурации цели prepare-agent
jacoco
- сценарий не jacoco
мое второе требование, IntelliJ IDEA не смог определить агент для jmockit, который я использую в проекте для проверки статического метода
Ответ 14
Я боролся в течение нескольких дней. Я попробовал все различные конфигурации, предложенные в этой теме. Ни один из них не работает. Наконец, я обнаружил, что только важной конфигурацией является цель prepare-agent. Но вы должны поместить это в правильную фазу. Я видел так много примеров, которые помещают его в "тест перед интеграцией", что вводит в заблуждение, поскольку оно будет выполнено только после модульного тестирования. Таким образом, unit тест не будет инструментирован.
Правильная конфигурация должна просто использовать фазу по умолчанию (не указывайте фазу явно). И обычно вам не нужно копаться в плагине 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>