2015-01-07 109 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)的步骤,您将看到混合两种语言。