Sonar + Jacoco,强悍的UT, IT 双覆盖率统计

以前做统计代码测试覆盖,一般用Cobertura。以前统计测试覆盖率,一般只算Unit Test,或者闭上眼睛把Unit Test和Integration Test一起算。

但是,我们已经过了迷信UT的时代:

  • UT不支持大幅度重构,如果对类和方法进行重构拆分,UT就失去了保障重构后代码仍然正确的作用,还要花时间按新的类和方法重写,其他用例对旧类和方法的mock改起来也是噩梦。
  • UT不支持基于用户故事的测试,即使覆盖率100%了,也不保证就是产品经理想要的东西。
  • UT对输入参数和Mock对象行为的假设,其实存在潜在的风险
  • 多线程,网络等等难于测试的地方。

在我看来,使用嵌入式容器的集成测试,如Spring Boot所倡导的基于嵌入式Jetty,H2等等的一整套集成测试体系,集合了UT(可本地快速运行,可直接assert应用内部属性,可统计覆盖率,如果CI失败了可以本地单独运行、debug、修复失败的case再提交)与FT(基于用户故事黑盒测试)的优点,对项目质量保证的地位一点不比UT低,所以同样需要计算覆盖率,而不是传统测试金字塔模型,只依赖UT的覆盖率。

所以Sonar + Jacoco 这种同时显示UT和IT测试覆盖率的组合非常实用。

照抄Sonar自带的Maven UT/IT示例项目,用maven插件,很容易就能跑出效果来,略。

花了我半天时间的,是如何用Jenkins上的SonarQubeRunner,跑出相同的效果,因为SonarQubeRunner不认识Maven是谁。

网上都是半新半旧,不咸不淡的文章,自己又摸索了一轮,得出一个只要一条不漏,便保证能跑的Jenkins + Maven + Sonar + Jacoco配置

在Jenkins上使用最新的SonarQube Runner 2.4,填入下面的配置


sonar.projectKey=xxx
sonar.projectName=xxx
sonar.projectVersion=xxx
sonar.modules=moduleA,moduleB,IT module C

#这里假设moduleA,moduleB 在根目录下的一层目录,Module C在二层目录下,需额外定义
#moduleC.projectBaseDir=xxx/moduleC

sonar.sourceEncoding=UTF-8
sonar.language=java
sonar.sources=src/main/java
sonar.tests=src/test/java
sonar.binaries=target/classes

#排除一些不想统计的类
#sonar.exclusions=**/*IDL.java

sonar.java.coveragePlugin=jacoco
sonar.jacoco.itReportPath=xxx/moduleC/target/jacoco-it.exec,最好写成绝对路径
sonar.junit.reportsPath=target/surefire-reports
sonar.surefire.reportsPath=target/surefire-reports

参考资料: JAVA代码覆盖率工具JaCoCo-原理篇

广州今天继续热的要命

This entry was posted in 技术. Bookmark the permalink.

2 Responses to Sonar + Jacoco,强悍的UT, IT 双覆盖率统计

  1. starfish says:

    我是来看图的

  2. 未厌 says:

    使用spring时,开发人员在做测试时,要等容器启动完,再等spring容器构建完(而且有可能构建失败,无法通过编译事情识别出错误),才能进行测试,随着版本不断迭代,项目中的代码量也会增长,所以每次单元测试的时间也会越来越长。
    推荐一个比spring轻量的ioc容器,guice,它是在编译期间完成容器的构建,能够在编译时,就识别出错误,以及一个机遇guice的全栈的框架Ninja Framework(www.ninjaframework.com)

发表评论

您的电子邮箱不会被公开。

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>