Подтвердить что ты не робот

SonarQube не собирает Unit Test Покрытие

У меня проблемы с сонаром, который собирает отчет по анализу джакоко. Однако Дженкинс может подобрать отчет и отобразить результаты. Мой проект - сборка Maven, построенная Дженкинсом. Отчет jacoco генерируется maven (настраивается в pom). Сонар выполняется с помощью плагина Jenkins.

Вот что я вижу на SonarQube:

SonarQube Screen Capture

Это отчет, который я вижу о проекте в Дженкинс.

Jacoco report in Jenkins

Конфигурация плагина maven:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.4.201312101107</version>
    <executions>
      <execution>
        <id>default-prepare-agent</id>
        <goals>
            <goal>prepare-agent</goal>
        </goals>
      </execution>
      <execution>
        <id>default-report</id>
        <phase>prepare-package</phase>
        <goals>
            <goal>report</goal>
        </goals>
      </execution>
      <execution>
          <id>default-check</id>
          <goals>
              <goal>check</goal>
          </goals>
      </execution>
    </executions>
</plugin>

Конфигурация плагина Jenkins Sonar enter image description here

4b9b3361

Ответ 1

Вам не хватало нескольких важных свойств сонара. Вот пример из одного из моих сборников:

sonar.jdbc.dialect=mssql
sonar.projectKey=projectname
sonar.projectName=Project Name
sonar.projectVersion=1.0
sonar.sources=src
sonar.language=java
sonar.binaries=build/classes
sonar.tests=junit
sonar.dynamicAnalysis=reuseReports
sonar.junit.reportsPath=build/test-reports
sonar.java.coveragePlugin=jacoco
sonar.jacoco.reportPath=build/test-reports/jacoco.exec

Ошибка в выпуске консоли Jenkins может быть очень полезной для получения покрытия кода.

Покрытие проекта установлено на 0%, так как нет каталогов с классами.
Указывает, что вы не установили свойство Sonar.Binaries правильно

Нет информации о покрытии за тест
Указывает, что свойство Sonar.Tests не установлено правильно

Информация о покрытии не была собрана. Возможно, вы забыли включить отладочную информацию в скомпилированные классы? Указывает, что свойство sonar.binaries установлено правильно, но эти файлы не были скомпилированы в режиме отладки, и они должны быть

Ответ 2

На основании https://github.com/SonarSource/sonar-examples/blob/master/projects/tycho/pom.xml у меня работает следующее POM:

<properties>
    <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.7.0.201403182114</version>
            <executions>
                <execution>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <destFile>${sonar.jacoco.reportPath}</destFile>
            </configuration>
        </plugin>
    </plugins>
</build>
  • Задание для файла назначения пути отчета гарантирует, что Sonar считывает именно тот файл, который генерирует JaCoCo.
  • Путь к отчету должен находиться за пределами каталогов проектов, чтобы учитывать межпроектное покрытие (например, в случае Tycho, где условием является наличие отдельных проектов для испытаний).
  • Параметр reuseReports предотвращает удаление файла отчета JaCoCo до его чтения! (Начиная с 4.3, это значение по умолчанию и устарело.)

Тогда я просто бегу

mvn clean install
mvn sonar:sonar

Ответ 3

У меня была похожая проблема, 0,0% покрытия и отсутствие подсчета юнит-тестов на приборной панели Sonar с SonarQube 6.7.2: Maven: 3.5.2, Java: 1.8, Jacoco: Работал с 7.0/7.9/8.0, ОС: Windows

После долгих попыток найти правильное решение для многомодульного проекта Maven, а не для однокомпонентного проекта, мы должны сказать, что нужно выбирать отчеты jacoco из отдельных модулей и объединять их в один отчет, поэтому проблема с этой конфигурацией решена, как выглядит мой родительский модуль. лайк:

 <properties>
            <!--Sonar -->
            <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
            <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
        <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
            <sonar.language>java</sonar.language>

        </properties>

        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <configuration>
                            <source>1.5</source>
                            <target>1.5</target>
                        </configuration>
                    </plugin>

                    <plugin>
                        <groupId>org.sonarsource.scanner.maven</groupId>
                        <artifactId>sonar-maven-plugin</artifactId>
                        <version>3.4.0.905</version>
                    </plugin>

                    <plugin>
                        <groupId>org.jacoco</groupId>
                        <artifactId>jacoco-maven-plugin</artifactId>
                        <version>0.7.9</version>
                        <configuration>
                            <destFile>${sonar.jacoco.reportPath}</destFile>
                            <append>true</append>
                        </configuration>
                        <executions>
                            <execution>
                                <id>agent</id>
                                <goals>
                                    <goal>prepare-agent</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>

                </plugins>
            </pluginManagement>
        </build>

Я пробовал несколько других опций, таких как jacoco-aggregate и даже создавал субмодуль, включив его в родительский pom, но ничего не получалось, и это просто. Я вижу в журналах <sonar.jacoco.reportPath> устарела, но все еще работает как есть и выглядит как автоматически заменяемая при выполнении или может быть вручную обновлена до <sonar.jacoco.reportPaths> или последней. После выполнения установки в cmd начните с чистой установки mvn, затем mvn org.jacoco: jacoco-maven-plugin: prepare-agent install (проверьте в целевой папке проекта, создан ли jacoco.exec), а затем выполните mvn sonar: sonar, это Что я пробовал, пожалуйста, дайте мне знать, если какое-либо другое лучшее возможное решение доступно. Надеюсь, это поможет! Если нет, пожалуйста, оставьте свой вопрос..

Ответ 4

Дженкинс не показывает результаты покрытия, так как это проблема совместимости версий между jenkins jacoco plugin и плагином maven jacoco. На моей стороне я исправил его, используя более новую версию плагина maven jacoco

<build>
   <pluginManagement>
     <plugins>
       <plugin>
         <groupId>org.jacoco</groupId>
         <artifactId>jacoco-maven-plugin</artifactId>
         <version>0.7.9</version>
       </plugin>
     <plugins>
   <pluginManagement>
<build>

Ответ 5

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

В вашем проекте вам нужен плагин Jacoco в вашем pom или родительском pom (вы уже получили это). Кроме того, вам нужен подключаемый модуль maven-surefire, который используется для отображения результатов теста. Все отчеты о тестах генерируются автоматически при запуске сборки maven. Самое сложное - найти правильные параметры для сонара. Похоже, что не все параметры работают с регулярными выражениями, и вы должны использовать для этого список, разделенный запятыми (на мой взгляд, документация не очень хорошая). Вот список параметров, которые я использовал (я использовал их в Bamboo, вы можете опустить "-D", если вы используете файл sonar.properties):

-Dsonar.branch.target=master (in newer version of SQ I had to remove this, so that master branch is analyzed correctly; I used auto branch checkbox in bamboo instead)
-Dsonar.working.directory=./target/sonar
-Dsonar.java.binaries=**/target/classes
-Dsonar.sources=./service-a/src,./service-b/src,./service-c/src,[..]
-Dsonar.exclusions=**/data/dto/**
-Dsonar.tests=.
-Dsonar.test.inclusions=**/*Test.java [-> all your tests have to end with "Test"]
-Dsonar.junit.reportPaths=./service-a/target/surefire-reports,./service-b/target/surefire-reports,
./service-c/target/surefire-reports,[..]
-Dsonar.jacoco.reportPaths=./service-a/target/jacoco.exec,./service-b/target/jacoco.exec,
./service-c/target/jacoco.exec,[..]
-Dsonar.projectVersion=${bamboo.buildNumber}
-Dsonar.coverage.exclusions=**/src/test/**,**/common/**
-Dsonar.cpd.exclusions=**/*Dto.java,**/*Entity.java,**/common/**

Если вы используете Lombok в своем проекте, вам также потребуется файл lombok.config для получения правильного покрытия кода. Файл lombok.config находится в корневом каталоге вашего проекта со следующим содержимым:

config.stopBubbling = true
lombok.addLombokGeneratedAnnotation = true

Ответ 6

Включите плагины sunfire и jacoco в pom.xml и Запустите команду maven, как показано ниже.

mvn jacoco: препарат-агент jacoco: сонар отчета: сонар

<properties>
    <surefire.version>2.17</surefire.version>
    <jacoco.version>0.7.2.201409121644</jacoco.version>

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${surefire.version}</version>
        </plugin> 

        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${jacoco.version}</version>

            <executions>
                <execution>
                    <id>default-prepare-agent</id>
                    <goals><goal>prepare-agent</goal></goals>
                </execution>
                <execution>
                    <id>default-report</id>
                    <phase>prepare-package</phase>
                    <goals><goal>report</goal></goals>
                </execution>
            </executions>
        </plugin>
    </plugins>