通常我们都是用SureFire 来做unit test 用 FailSafe 做integration test。 这两个插件的区别主要在于SureFire 发现有失败的单元测试默认就会报错, 而FailSafe 会保证所有的集成测试都做完。
如果是简单的用这两个插件来做测试的统计是没有问题的, Maven 默认都支持的。 但是如果牵扯到支持代码的覆盖率, 并且将这两种测试的覆盖率都能在Sonar 里面能统计出来就比较麻烦了。 搜遍互联网没有几个比较靠谱的。 其中比较靠谱的也 https://davidvaleri.wordpress.com/2013/09/06/tracking-integration-test-coverage-with-maven-and-sonarqube/ 。 这个链接只做了maven-failsafe-plugin 统计集成测试的。 另外一个链接 http://www.petrikainulainen.net/programming/maven/creating-code-coverage-reports-for-unit-and-integration-tests-with-the-jacoco-maven-plugin/, 这个链接倒是有讲单元测试,集成测试合在一起。
这里面有点关键点就是
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.7.2.201409121644</version> <executions> <execution> <id>prepare-unit-test-agent</id> <goals> <goal>prepare-agent</goal> </goals> <configuration> <destFile>${basedir}/target/jacoco.exec</destFile> <propertyName>surefire.argLine</propertyName> </configuration> </execution> <execution> <id>generate-unit-test-report</id> <goals> <goal>report</goal> </goals> </execution> <execution> <id>failsafe_</id> <goals> <goal>prepare-agent-integration</goal> </goals> <configuration> <destFile>${basedir}/target/jacoco-it.exec</destFile> <propertyName>jacoco.agent.arg</propertyName> </configuration> </execution> <execution> <id>failsafe_report</id> <goals> <goal>report-integration</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.10</version> <configuration> <forkCount>1</forkCount> <reuseForks>false</reuseForks> <argLine>-Xmx512M -XX:MaxPermSize=200M ${surefire.argLine}</argLine> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.16</version> <configuration> <!--skip>${skipIntegrationTests}</skip--> <argLine>${jacoco.agent.arg}</argLine> <includes> <include>**/ITCase*.java</include> <include>**/*ITCase.java</include> </includes> </configuration> <executions> <execution> <goals> <goal>integration-test</goal> </goals> </execution> </executions> </plugin>
我们得确保jacoco 输出 <propertyName>surefire.argLine</propertyName> 跟 surefire 或者failsafe 的 argLine 对应。
这样在Sonar 中我们就可以看到这样的结果
最近看看Sonar 生成的Report 好像coverage 都是0, 汗啊!
应该是有参数没有设定好, 参考了网上的另外一个blog http://www.aheritier.net/maven-failsafe-sonar-and-jacoco-are-in-a-boat/
现在终于比较靠谱点了。