2014-03-04 183 views
25

我遇到了聲納拾取jacoco分析報告的問題。但詹金斯能夠拿起報告並顯示結果。 我的項目是一個由Jenkins構建的maven構建版本。 jacoco報告由maven生成(在pom中配置)。聲納通過使用Jenkins插件執行。SonarQube沒有拿起單位測試覆蓋範圍

這就是我看到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> 

詹金斯聲納插件配置 enter image description here

+1

某處在您的控制檯輸出應該說, 「代碼覆蓋率爲0%......」,那信息將有助於調試您的問題。有兩件事情在腦海中浮現:1.您應該設置sonar.binaries屬性並將其指向您編譯的類文件2.您應該設置sonar.tests並將其指向未編譯的測試文件。 3.你應該在調試模式下編譯(你可能已經不知道了) – Cole9350

+0

@ Cole9350,所以我在輸出中看到的錯誤是: _Project coverage設置爲0%,因爲沒有classes目錄._ 我已經嘗試將sonar.binaries設置爲classes目錄的根目錄 -/target/classes - 但是這導致錯誤,說他們找不到 – anton91

+0

**更正**我再次嘗試並設置類的完全合格路徑我現在可以看到代碼覆蓋率。 但是我知道當jacoco傳感器運行時看到錯誤:沒有關於每個測試的覆蓋率的信息。 – anton91

回答

41

你失蹤了幾個重要的聲納性能,這是從我建立一個樣本:

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

設置並非都是必需的(對於檢查dynamicAnalysis已棄用)。我爲此提升了二進制屬性,我已經設置了這個錯誤。 – user1226868

+0

嗨,我有相同的Android-Kotlin配置,構建生成成功,除了代碼覆蓋一切都已到位。任何建議可能會錯過。僅供參考:我正在使用您提到的完全相同的配置。 – CoDe

5

基於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,this is the default和棄用。)

然後我就跑

mvn clean install 
mvn sonar:sonar 
+0

非常感謝,它節省了我的時間。好的解決方案 –

0

詹金斯不顯示的覆蓋效果,因爲它是詹金斯jacoco插件和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> 
0

包含的SUNFIRE並在pom.xml jacoco插件和 運行如下面給出的行家命令固定它。

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> 
相關問題