02-变异测试
一言以蔽之,变异测试研究如何编写能够暴露缺陷的测试用例,以及如何提升测试可信度。
将这些测试用例应用到待测程序中,就很有可能会发现待测程序的缺陷。
概念
变异体
基于一定的语法(Syntax)变换规则,通过对源程序进行程序变换(Program Transformation)得到的一系列变体。
源程序不包含 Defect,变异体包含,那这个 Defect 叫人工缺陷
变异算子
上面所说的变换规则就是变异算子。
变异存活、杀死
如果一个变异体无法通过测试用例,这个变异体就被这个测试用例杀死了。
变异得分
变异测试对测试套件错误检测能力的量化。
是对于一个测试用例而言的。score 是所有变异体在这个测试用例上运行失败的比例。
下标 k 代表变体 killed,被检测到了;s 代表 survived,没有被检测到。
$$ score=\frac{mut_k}{mut_s+mut_k}\times100% $$
假设
基于这些假设,我们可以认为变异测试有效:
- 缺陷是简单的、可模拟的
- 变异体模拟这些缺陷
- 老练程序员假设:一个老练程序员编写的错误程序与正确程序相差不大
- 缺陷可叠加
- 复杂变异体可以通过耦合简单变异体得到
- 能够杀死简单变异体的测试用例可以杀死复杂变异体
- 缺陷检测有效性
- 能检测人工缺陷的样例,也能检测真实程序的缺陷
步骤
1. 变异体筛选
- 对变异体进行筛选
- 通过变异算子筛选
2. 变异体生成
将选中的变异体通过算子实例化。
3. 变异体优化
去除等价和无效变异体。
目的:减小开销、提高变异得分可信度
形式:静态分析
4. 变异体执行
最昂贵的阶段。
5. 变异得分计算
计算被杀死的变异体数量,进而得到变异得分、量化测试的充分性。
应用与研究
传统方向
测试优化、测试生成、调试辅助
非传统
非确定系统、行为建模、算子定义
总结
这张图给个好评!