测试覆盖率
概述
测试覆盖率通常被用来衡量测试的充分性和完整性。覆盖率是用来度量测试完整性的手段,是测试效果衡量的标准,是测试技术有效性的度量。
从广义的角度来讲,主要分为两大类:
- 面向项目的需求覆盖率
- 更偏向技术的代码覆盖率
1. 需求覆盖率
需求覆盖率是指测试对需求的覆盖程度。通常的做法是将每一条分解后的软件需求和对应的测试建立一对多的映射关系,最终目标是保证测试可以覆盖每个需求,以保证软件产品的质量。需求覆盖率统计方法基于传统的软件工程瀑布型的开发过程,测试项目中很少直接基于需求来衡量测试覆盖率,而是将软件需求转换成测试需求,然后基于测试需求再来设计测试点。
测试需求是指测试人员依据初期用户需求和需求规格说明书,评估需要测试的功能点、每个功能的测试类型和功能点的测试终止点,并评估出测试的规模、复杂程度和风险等内容。测试需求越详细精确,测试任务越明晰,可以更好的进行测试的质量和进度的控制。
测试需求的分类
根据不同的测试需求可以进行相应的测试用例覆盖分析和度量:
-
公共测试需求:同类型系统共同需要的通用的测试需求。例如,登陆窗口和查询界面的测试。通过不断完善通用模块的测试用例,保证覆盖度的同时,可以节省大量的用例设计成本。
-
项目测试需求:针对不同项目的特点而制定的测试需求,采用不同的测试覆盖方法,通常可以分为:
- 基于功能点的常用黑盒用例设计的覆盖
- 基于业务流程的分支覆盖、路径覆盖和场景法覆盖等
- 通用测试需求覆盖
- 非功能性测试的覆盖
-
显性测试需求:测试中大多数的需求是显式的,可以直接获取的需求,如项目组提供的各类需求文档、会议纪要、用户手册以及项目组主动告知的一些需求等。
-
隐性测试需求:隐性的测试需求不是用户需求和开发文档中明确提出来的,需要测试人员运用实际经验和软件网络知识的综合运用所分析出来的需求。如程序运行中的内存或缓存区的限制、某知识领域的行业标准或规范中隐含的需求等。
2. 代码覆盖率
代码覆盖率是基于代码层面,是指至少被执行了一次的条目数占整个条目数的百分比。
- 如果”条目数”是语句,对应的就是代码行覆盖率
- 如果”条目数”是函数,对应的就是函数覆盖率
- 如果”条目数”是路径,对应的就是路径覆盖率
依此类推,就可以得到绝大多数常见的代码覆盖率类型的定义。
这里的代码覆盖率的原理概念同样可以应用与基于业务流程分析的覆盖,每条业务指令类似于程序指令,业务流程的分支点类似于程序分支,同样循环也同样类似。
代码覆盖率的目的
现在很多项目都在单元测试以及集成测试阶段统计代码覆盖率,但是统计代码覆盖率仅仅是手段,必须透过现象看到事物的本质,才能从根本上保证软件整体的质量。统计代码覆盖率的根本目的是找出潜在的遗漏测试用例,并有针对性地进行补充,同时还可以识别出代码中那些由于需求变更等原因造成的不可达的废弃代码。
代码覆盖率的成本
通常我们希望代码覆盖率越高越好,代码覆盖率越高越能说明你的测试用例设计是充分且完备的,但你也会发现测试的成本会随着代码覆盖率的提高以类似指数级的方式迅速增加。
例如:
- 如果想达到 70% 的代码覆盖率,你可能只需要 30 分钟的时间成本
- 但如果你想把代码覆盖率提高到 90%,那么为了这额外的 20%,你可能花的时间就远不止 30 分钟了
- 更进一步,如果你想达到 100% 的代码覆盖率,可想你花费的代价就会更大了
为什么代码覆盖率的提高,需要付出越来越大的代价呢?因为在后期,需要大量的桩代码、Mock代码和全局变量的配合来控制执行路径。
所以,在软件企业中,只有单元测试阶段对代码覆盖率有较高的要求。因为从技术实现上讲,单元测试可以最大化地利用打桩技术来提高覆盖率。而你如果想在集成测试或者是接口测试阶段将代码覆盖率提高到一定量级,那你所要付出的代价是巨大的,而且在很多情况下根本就实现不了。
代码覆盖率的局限性
代码覆盖率的计算是基于现有代码的,并不能发现那些”未考虑某些输入”以及”未处理某些情况”形成的缺陷。
例如,如果一个被测函数里面只有一行代码,只要这个函数被调用过了,那么衡量这一行代码质量的所有覆盖率指标都会是 100%,但是这个函数是否真正实现了应该需要实现的功能呢?
显然,代码覆盖率反映的仅仅是已有代码的哪些逻辑被执行过了,哪些逻辑还没有被执行过。以此为依据,你可以补充测试用例,可以去测试那些还没有覆盖到的执行路径。但也是仅此而已,对于那些压根还没有代码实现的部分,基于代码覆盖率的统计指标就无能为力了。
总结
高的代码覆盖率不一定能保证软件的质量,但是低的代码覆盖率一定不能保证软件的质量。
下一节开始我们将学习到不同的测试用例设计方法,在测试工作中需要有效地灵活综合应用这些方法,可以帮助提高测试覆盖率、测试用例的有效性,使得测试工作事半功倍。
思考题:
请解释测试覆盖率的基本概念,并列举至少三种常见的覆盖率指标及其含义。谈谈在实际项目中,是否测试覆盖率越高就代表软件质量越好?为什么?