JaCoCo - SonarQube - Нет информации о покрытии за тест
Я использую JaCoCo для покрытия кода. Отчеты Unit Test создаются с помощью junit, и они импортируются правильно, поэтому информация Unit Test отображается правильно.
проблема заключается в том, что я получаю сообщение об ошибке:
Нет информации о покрытии за тест., а охват кода показывает значение 0% для модульных тестов, тестов интеграции и общего охвата.
Я проверил всю необходимую информацию в sonar-project.properties, например, binary, src, tests и т.д.
Я использую:
- SonarQube 4.5.1
- SonarRunner 2.4
- MySQL
- junit 4.1.1
- jacoco 0.7.2
jacoco.exec находится в файле/цели в базовом каталоге проекта.
Ниже вы можете увидеть sonar-project.properties:
С моей точки зрения все необходимые пути установлены правильно. (т.е. бинарные, src, тесты)
Comma-separated paths to directories with sources (required)
sonar.sources=src
compiled code
sonar.java.binaries=class
source code of unit tests
sonar.tests=test/src
Comma-separated paths to files with third-party libraries (JAR files in the case of Java)
sonar.java.libraries=jar
Language
sonar.language=java
Encoding of the source files
sonar.sourceEncoding=UTF-8
Additional parameters
sonar.my.property=value
Set Project Base
sonar.projectBaseDir=C:/snapshots/steffen_latest/software/java
Tells SonarQube to reuse existing reports for unit tests execution and coverage reports
sonar.dynamicAnalysis=reuseReports
JUnit path
sonar.surefire.reportsPath=test/report/junit
Tells SonarQube where the unit tests execution reports are
sonar.junit.reportsPath=test/report/junit
Tells SonarQube that the code coverage tool by unit tests is JaCoCo
sonar.java.coveragePlugin=jacoco
Import JaCoCo code coverage report.
Tells SonarQube where the unit tests code coverage report is
Unit Tests Coverage
sonar.jacoco.reportPath=target/jacoco.exec
Tells SonarQube where the integration tests code coverage report is
sonar.jacoco.itReportPath=target/it-jacoco.exec
Это файл регистрации сонара:
13:56:05.883 INFO - Sensor SurefireSensor...
13:56:05.883 INFO - parsing C:\work\snapshots\steffen_latest\software\java\test\report\junit
13:56:06.149 INFO - Sensor SurefireSensor done: 266 ms
13:56:06.149 INFO - Sensor JaCoCoItSensor...
13:56:06.195 INFO - Analysing C:\work\snapshots\steffen_latest\software\java\target\it-jacoco.exec
13:56:06.726 INFO - **No information about coverage per test**.
13:56:06.726 INFO - Sensor JaCoCoItSensor done: 577 ms
13:56:06.726 INFO - Sensor JaCoCoOverallSensor...
13:56:06.851 INFO - Analysing C:\work\snapshots\steffen_latest\software\java\.sonar\jacoco-overall.exec
13:56:07.178 INFO - **No information about coverage per test**.
13:56:07.178 INFO - Sensor JaCoCoOverallSensor done: 452 ms
13:56:07.178 INFO - Sensor JaCoCoSensor...
13:56:07.209 INFO - Analysing C:\work\snapshots\steffen_latest\or_base\software\java\target\jacoco.exec
13:56:07.521 INFO - **No information about coverage per test**.
13:56:07.521 INFO - Sensor JaCoCoSensor done: 343 ms
13:56:07.521 INFO - Sensor CPD Sensor (wrapped)...
13:56:07.521 INFO - JavaCpdEngine is used for java
13:56:07.521 INFO - Cross-project analysis disabled
13:56:09.019 INFO - Sensor CPD Sensor (wrapped) done: 1498 ms
13:56:09.144 INFO - Execute decorators...
13:56:16.166 INFO - Store results in database
Может ли кто-нибудь дать мне совет, что может быть проблемой?
Поскольку я не знаю, в чем проблема...
Я работаю над этими проблемами с нескольких дней, и я действительно не знаю, что делать.
Спасибо заранее.
Ответы
Ответ 1
Пробовали ли вы использовать prepare-agent
?
mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install
Кроме того, если ваше покрытие продолжает показывать 0%, вам может потребоваться этот совет:
Если ваш проект уже использует argLine для настройки плагина surefire-maven, убедитесь, что argLine определен как свойство, а не как часть конфигурации плагина.
Ответ 2
С этой конфигурацией Maven я могу видеть покрытие на тестовые данные.
Вам нужно настроить sonar-jacoco-listeners, чтобы получить покрытие за тест.
Имейте в виду, что он не рекомендуется сонаром: "эта функция устарела на уровне SonarQube и больше не будет получать дальнейших улучшений/обслуживания".
<skipTests>false</skipTests>
<!--Jacoco settings -->
<jacoco.haltOnFailure>false</jacoco.haltOnFailure>
<jacoco.skip>false</jacoco.skip>
<!-- sonar JACOCO properties -->
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.jacoco.reportPaths>${project.reporting.outputDirectory}/jacoco-ut.exec</sonar.jacoco.reportPaths>
<sonar.language>java</sonar.language>
<!-- Added for Jacoco -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<properties>
<property>
<name>listener</name>
<value>org.sonar.java.jacoco.JUnitListener</value>
</property>
</properties>
</configuration>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.1</version>
<configuration>
<destFile>${sonar.jacoco.reportPaths}</destFile>
<append>true</append>
</configuration>
<executions>
<execution>
<id>agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>org.jacoco.agent</artifactId>
<version>0.8.1</version>
<classifier>runtime</classifier>
</dependency>
<dependency>
<groupId>org.codehaus.sonar-plugins.java</groupId>
<artifactId>sonar-jacoco-listeners</artifactId>
<version>1.2</version>
<scope>test</scope>
</dependency>
Ответ 3
В моем случае ниже действуют команды.
mvn clean org.jacoco:jacoco-maven-plugin:0.7.3.201502191951:prepare-agent install
mvn sonar:sonar
Чтобы проверить покрытие кода: Запустить сервер SonarQube → выполнить над двумя командами один за другим, и вы увидите охват кода в Клиент SonarQube.
![Охват кода SonarQube]()
FYI: Моя версия SonarQube - 5.1.2. Вы можете загрузить последнюю версию из Загрузка SonarQube
Ответ 4
Я использую JUnit, и в моем случае проблема была связана с наличием зависимости TestNG в моем pom.xml. После удаления этой ненужной зависимости все начало работать, как ожидалось.
Ответ 5
Обязательно разделить сборку и анализ на два разных этапа сборки:
mvn clean install
mvn sonar:sonar