基于jacoco的集成测试及回归测试覆盖率

前言

代码覆盖率是用来干什么的?得到之后呢?

这是昨天隔壁小伙问我的问题,仔细想了一想。代码覆盖率只是对于测试质量评估的某一个维度而已。并不是什么指标等硬性的要求。大多数项目其实都用上了单元测试的代码覆盖率,java项目的jacoco, js下的karma等工具也也来越容易使用。在我这有限的工作经验中也经历过多次对于代码覆盖率的讨论,尤其是UT的test coverage。在java项目中,尤其是事务脚本类的web结构代码,代码覆盖率就更加无法代表代码质量。

换个角度去看,测试覆盖率可以帮助找到没有被测试到case,这样反而意义更大。这也是本文提到集成测试和回归测试的覆盖率的起因。

代码覆盖率工具

Jacoco是现在java项目常用的覆盖率工具,jacoco的代码覆盖粒度包括了 方法分支指令
jacoco插庄

这是几种java代码覆盖率工具(jacoco, emma, Cobertura)使用的插庄方式,
本文要说的是基于byte code的植入方式。jacoco使用的是基于javaagent 的on-the-fly模式。
这种方式相比于offline无需修改代码,并且可以在程序运行时dump覆盖率报告,但是需要开启额外的代理。

JacocoAgent

jacoco的on-the-fly 模式是基于javaagent。需要在启动程序的jvm参数中指定-javaagent 的jar文件,也就是存在机器某个位置的jacocoAgent.jar 文件。

jacocoAgent的报告dump方式有三种:

  • local file
    在jvm参数值配置output路径
    -javaagent:[yourpath/]jacocoagent.jar=output=/user/path/jacoco.exec

  • TCP server
    配置address和port,然后使用jacocoant,dump jacoco报告。

  • TCP client
    配置address和port,然后使用jacocoant,数据直接sync到remote端口。

dump报告

在server使用jacocoAgent启动后,jacoco会一直检测启动后这段时间内的server运行锁执行过的程序生成覆盖率报告。
jacocoAgent默认会在jvm stop是自动dump报告数据。但是也可以通过Ant Tasksjacoco mvn plugin 来dump。
具体使用可参照文档。

Refrence: