一、前言
如何评估测试是否充分以及产品质量好坏一直是一个很难的事情,传统上:
从测试工程师角度,我们通常用自动(手动)测试用例数量,这些用例对需求覆盖率, HSF/Http等接口覆盖率,bug数等几个维度去评估。
从开发工程师角度,我们通常使用单元测试对产品代码的行/路径覆盖率去评估。
但是这些方式都有很多缺点,比如很多数据依赖于人去手动去统计,或者拍脑袋去评估,以及产品开发的习惯,单元测试缺失等,导致我们评估产品质量好坏和测试是否充分只能通过上线后发现的故障去评估,都是事后去补救,下面我谈谈如何在产品上线前通过所有测试活动对产品代码的覆盖率去评估测试是否充分,实现精准测试和回归
二、统计代码覆盖率的价值
1.分析未覆盖部分的代码,从而反推在前期测试设计是否充分,没有覆盖到的代码是否是测试设计的盲点,为什么没有考虑到?需求/设计不够清晰,测试设计的理解有误,工程方法应用后的造成的策略性放弃等等,之后进行补充测试用例设计。
2.检测出程序中的废代码,可以逆向反推在代码设计中思维混乱点,提醒设计/开发人员理清代码逻辑关系,提升代码质量。
3.代码覆盖率高不能说明代码质量高,但是反过来看,代码覆盖率低,代码质量不会高到哪里去,可以作为测试自我审视的重要工具之一
所以,对于我们来说,重点关注的是核心类的还未覆盖的代码,很可能这些代码就会产生故障
三、获取代码覆盖率
市面上统计代码覆盖率的工具有很多,比如Cobertura,Emma,Jacoco,Jmockit等,其中Jacoco基于java字节码的原理,能够统计单元测试和集成测试时候的覆盖率,所以我以Jacoco为例,介绍如何在实际项目测试活动使用代码覆盖率进行统计,达到精准测试的目的从而降低每次回归的成本。
四、获取单元测试的代码覆盖率
单元测试框架我们使用的是Junit + Jmockit + Jacoco的经典组合,Jmockit是非常优秀的mock工具,它也自带代码覆盖率的统计,但是相比Jacoco来说,还是太弱了。
获取单元测试覆盖率很简单,只需要在POM中加上jacoco的maven插件就行
在Maven中配置Jacoco统计单元测试代码覆盖率:
配置好以后,我们就可以通过mvn clean test命令执行写好的单元测试用例并自动生成覆盖率报告,覆盖率报告的二进制文件以及html格式文件分别在:
Jacoco的二进制文件很重要,我们可以利用它提供的API来合并单元测试和集成测试的覆盖率二进制文件。
五、获取集成测试的代码覆盖率
这里说的集成测试包括:接口/UI的自动化测试,手动的探索性测试
我们利用Jacoco的Java agent在产品运行时中统计在集成测试进行中的代码覆盖率,在产品代码中加agent,我们需要修改产品的基线文件 placeholder.sh,增加一行:
其中jacocoagent.jar和需要统计的package,依据你产品实际情况修改,更多细节参考Jacoco的官方文档:Jacoco Agent,注意,千万不要在生产环境上加agent,否则会引起严重的安全问题
利用placeholder.sh重启应用服务器后生效
六、通过Jacoco API实时获取集成测试后的代码覆盖率
引入Jacoco SDK:
通过TCP Socket从应用服务器获取覆盖率二进制文件:
.......
来源于《51测试天地》原创测试文章系列(四十四)