在做API测试或者单元测试时,衡量测试是否全面的一个很重要的指标就是测试覆盖率,其中测试覆盖包括语句覆盖、分支覆盖等类型,虽然高的覆盖率并不能代表测试好了被测试代码,但是低的覆盖率肯定没有测试好被测试的代码,因此在实际工作中,较高的代码覆盖率仍然是测试时需要关注的。
当下,统计代码覆盖率的工具有很多,经对比筛选,笔者选用了Cobertura ,Cobertura 是一种开源工具,它通过检测基本的代码,并观察在测试包运行时执行了哪些代码和没有执行哪些代码,来测量测试覆盖率。除了找出未测试到的代码并发现 bug 外,Cobertura 还可以通过标记无用的、执行不到的代码来优化代码。
讲解Cobertura的使用之前,先展示一下笔者使用Cobertura统计出来的前段时间编写的BSP对外API测试代码的测试覆盖率:
上图是测试覆盖率报告的概要图,显示了测试的包、类,及整体的行覆盖率和分支覆盖率,其中,点击相应的包连接可以查看该包执行的详细信息,见下图:
点击每个类连接可以查看该类的详细执行情况,见下图。
在上图中,不仅可以看出UserServiceImpl类的行覆盖率,分支覆盖率,还可以看出UserServiceImpl类中的哪些代码执行了,哪些代码没有执行(红色背景的代码是没有执行到的),由上图可以很直观的看出,我们的测试没有覆盖到创建用户失败的场景。
经过实践验证,Cobertura可以满足现有统计代码覆盖率的需求,并将其集成到现有API测试框架中,以后在使用API测试框架进行测试时,只需要简单配置即可同步完成标记成功和失败的Junit测试报告(见下图)
和基于Cobertura的测试覆盖率报告(见前面案例截图)。
配置方式:在API测试框架的build_main.xml文件中进行如下类似配置即可。
在<fieldset>标签中,增加相应的“<include name”标签即可,此处支持模糊匹配和正则表达式。
1、在执行Junit测试用例之前,根据用户配置,把需要监控的包、类对应的class文件插入一些特殊的标记,见下图(反编译)。
上图中,红框框住的部分都是由Cobertura插入的用于统计执行情况的标记代码。
2、配置classpath时,将插入标记的class文件配置未插入标记的class文件之前。
3、执行测试用例时,Cobertura的这些标记会记录每一行的执行情况,并将执行信息存储至cobertura.ser文件中。
4、生成测试覆盖率报告时,Cobertura会将执行情况及相关源码生成html格式的测试报告。