2015-01-07 108 views
1

該項目是一個多模塊maven項目,其中90%的源代碼用Java編寫(在Scala中有一點點)。單元測試是80/20 java/scala,集成測試是20/80 java/scala。通過scala測試獲取java代碼的代碼覆蓋

我試過Clover,但是at this time它不支持scala。

我試過Jacoco。首先,我遇到了由於多模塊配置導致的任何結果的問題,但是現在使用Sonar,我已經看到了java覆蓋範圍(感謝http://www.aheritier.net/maven-failsafe-sonar-and-jacoco-are-in-a-boat/)。我用jacoco的timezra(http://timezra.blogspot.com/2013/10/jacoco-and-scala.html),但只分析了scala的一小部分源代碼。

我開始嘗試Scoverage,但這似乎與timezra有相同的問題(它分析scala-scala,而不是我的組合)。我爲此甚至沒有嘗試scct或臥底。


有什麼工具可以處理混合的java/scala嗎?

+0

Emma通過字節碼工具工作,所以也許它會工作?我還沒有嘗試過。 – lmm

回答

2

我建議爲Java和Scala有兩個單獨的覆蓋工具。更具體地說,對於Scala使用Scoverage(使用plugin for Sonar)。

的原因是,對於Java你可能會想衡量線覆蓋其中斯卡拉這是更好的衡量語句覆蓋。簡單地說,因爲在Scala的單行中有很多語句,並且您想要測量哪些語句被調用。我寫了an article about this

+0

兩個獨立的覆蓋工具不適合我。我發現,使用我的scala測試來檢查java代碼,覆蓋工具只能執行java-java或scala-scala。 – GrandVizier

+0

你如何使用兩種工具?如果我在項目上運行jacoco,它會給我所有scala上的覆蓋很差。你如何整合這兩個結果來獲得工作結果? –

1

爲了回答我自己的問題,Jacoco確實分析了Scala測試和Java代碼的覆蓋範圍。我還沒有看到任何相反的事情(但我們沒有任何針對Scala代碼的Java測試,所以沒關係)。

至於結合覆蓋面,Rado使用兩種工具的答案是有道理的。


下面是我對我的pom所做的更改以獲得保護。

性質:

<!-- Jacoco and Sonar config properties --> 
    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin> 
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis> 
    <jacoco.version>0.7.2.201409121644</jacoco.version> 
    <sonar-jacoco-listeners.version>1.4</sonar-jacoco-listeners.version> 

    <jacoco.outputDir>${basedir}/target/</jacoco.outputDir> 
    <jacoco.out.ut.file>jacoco-ut.exec</jacoco.out.ut.file> 
    <jacoco.out.it.file>jacoco-it.exec</jacoco.out.it.file> 

    <sonar.jacoco.reportPath>${jacoco.outputDir}/${jacoco.out.ut.file}</sonar.jacoco.reportPath> 
    <sonar.jacoco.itReportPath>${jacoco.outputDir}/${jacoco.out.it.file}</sonar.jacoco.itReportPath> 

故障安全:

 <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-failsafe-plugin</artifactId> 
     <version>2.17</version> 
     <configuration> 
      <argLine>-Xms512m -Xmx1024m ${jacoco.agent.it.arg}</argLine> 
      <properties> 
      <property> 
       <name>listener</name> 
       <value>org.sonar.java.jacoco.JUnitListener</value> 
      </property> 
      </properties> 
      <reportsDirectory>${jacoco.outputDir}/surefire-reports</reportsDirectory> 
     </configuration> 
     <executions> 
      <execution> 
      <goals> 
       <goal>integration-test</goal> 
       <goal>verify</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin>   

jacoco:

 <plugin> 
     <groupId>org.jacoco</groupId> 
     <artifactId>jacoco-maven-plugin</artifactId> 
     <version>${jacoco.version}</version> 
     <executions> 
      <execution> 
      <id>prepare-ut-agent</id> 
      <phase>process-test-classes</phase> 
      <goals> 
       <goal>prepare-agent</goal> 
      </goals> 
      <configuration> 
       <destFile>${sonar.jacoco.reportPath}</destFile> 
       <propertyName>jacoco.agent.ut.arg</propertyName> 
       <append>true</append> 
      </configuration> 
      </execution> 
      <execution> 
      <id>prepare-it-agent</id> 
      <phase>pre-integration-test</phase> 
      <goals> 
       <goal>prepare-agent-integration</goal> 
      </goals> 
      <configuration> 
       <destFile>${sonar.jacoco.itReportPath}</destFile> 
       <propertyName>jacoco.agent.it.arg</propertyName> 
       <append>true</append> 
      </configuration> 
      </execution> 
      <execution> 
      <id>default-report</id> 
      <phase>package</phase> 
      <goals> 
       <goal>report</goal> 
      </goals> 
      <configuration> 
       <dataFile>${sonar.jacoco.reportPath}</dataFile> 
      </configuration> 
      </execution> 
      <execution> 
      <id>integration-report</id> 
      <phase>post-integration-test</phase> 
      <goals> 
       <goal>report-integration</goal> 
      </goals> 
      <configuration> 
       <dataFile>${sonar.jacoco.itReportPath}</dataFile> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
注意,我創建Jacoco當測試運行,然後再使用聲納進行詳細分析報告

surefire:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.17</version> 
      <configuration> 
      <argLine>${jacoco.agent.ut.arg} -Xms512m -Xmx1024m</argLine> 
      <skipTests>false</skipTests> 
      <properties> 
       <property> 
       <name>listener</name> 
       <value>org.sonar.java.jacoco.JUnitListener</value> 
       </property> 
      </properties> 
      <reportsDirectory>${jacoco.outputDir}/surefire-reports</reportsDirectory> 
      </configuration> 
     </plugin> 

添加依賴關係:

<dependency> 
     <groupId>org.codehaus.sonar-plugins.java</groupId> 
     <artifactId>sonar-jacoco-listeners</artifactId> 
     <version>${sonar-jacoco-listeners.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.sonar.plugins</groupId> 
     <artifactId>sonar-surefire-plugin</artifactId> 
     <version>3.3.2</version> 
     <scope>test</scope> 
    </dependency> 
0

很可能看到兩種語言覆蓋面的組合。 用聲納是不可能的,因爲它只分析一種語言。

如果您使用jenkins,並配置一個收集覆蓋報告(Jacoco)的步驟,您將看到混合兩種語言。