以注入缺陷的方式查找缺陷:精妙的变异测试
在软件开发周期接近尾声,新功能都已完成且所有测试都通过时,作为测试经理,你是否准备好发布软件?实际上,测试套件全部通过并不一定意味着测试套件足够好。若测试套件不能正确检查程序结果,即便结果错误,测试也可能通过。那么,如何检验测试套件发现缺陷的有效性呢?本文将介绍一种简单、优雅且精妙的方法——变异测试。
评估测试套件质量
工程师和管理者倾向于量化事物,测试套件的质量也不例外。为衡量测试套件质量,实践中开发并应用了多种覆盖指标,常见的有代码覆盖,即检查测试套件中每条语句是否被执行。若测试套件未执行某条语句,而该语句存在每次执行都会触发失败的缺陷,那么这个缺陷在测试阶段就无法被发现。
除代码覆盖外,还有更高级的指标:
-分支覆盖:确保每个分支至少被执行一次。
-条件覆盖:确保每个(子)条件分别被评估为真和假各一次。
这些指标易于衡量,常被用作质量目标,如“所有模块的代码覆盖率必须至少达到90%”。然而,这些测试质量指标存在问题:
1.缺陷分布不均:程序中缺陷并非均匀分布,存在“帕累托效应”,即20%的模块包含80%的缺陷。测试套件应聚焦于易出现缺陷的模块,而非在无缺陷的类上花费精力以达到高覆盖率。
2.风险分布不均:项目中部分模块的缺陷会带来严重后果,因为它们被频繁使用或整个功能依赖于它们。测试工作应根据风险分配,而非单纯追求特定的覆盖率。
3.指标不关注测试本身:覆盖