软件测试
目的
通过在编写代码的整个过程中添加测试的检测流程,来减少设计失误、笔误、以及在程序中表现出来的失误。
基本概念
PIE模型
错误分类
- Fault:程序中的错误代码
- Error:错误代码导致的错误状态
- Failure:错误状态表现出来后被感知
测试能够发现的错误只有Failure级别,即表现出来的错误。程序中处于Error和Fault级别的错误单靠测试是无法检测出来。所以这需要开发工程师自己做白盒测试尽量避免Fault的出现。
白盒测试方法
通过白盒测试,希望开发工程师在设计代码编写代码之后,能够自己证明代码是无误的。就像数学题算完之后的检验方法一样。
图覆盖
任何代码都可以用图的方式表示。在测试的时候,将图的每一部分跑一遍,看看能不能得到正确结果的方法就是图覆盖。
控制流生成
程序的控制流,由工作语句、if、while/for、switch组成。也相当与代码逻辑的流程图。
结构化覆盖
节点覆盖/边覆盖,控制流覆盖的一部分
主路径覆盖
简单路径:每个节点在路径中只出现一次。
主路径:最长的简单路径,不是任何简单路径的子集。
生成测试用例,覆盖所有主路径。主路径覆盖可以减少覆盖的工作量
基本路径覆盖
独立路径:路径中含有其他路径中不含有的节点或者边
线性独立路径个数:CC=E-V+2(圈复杂度)
基本路径测试步骤:
- 生成控制流图
- 计算圈复杂度
- 选择基本路径集
- 生成基本路径测试用例
数据流覆盖
程序控制流中,点上操作的正确性。变量操作包括:
- 定义:分配内存,赋值、初始化
- 使用:进行操作,判断等
- 定义引用对:在前面定义,在后面引用
- 定义清晰:前面定义,后面使用之间,没有被重新定义
- 数据流可达:有一条定义清晰的路径从i到j
- 定义引用路径(du-path):从定义到使用的简单路径,路径定义清晰
数据流覆盖准则
- ADC:全定义覆盖,所有定义的地方都覆盖过
- AUC: 全引用覆盖,所有引用的地方都覆盖过,包括所有的定义也都覆盖过
- ADUPC:全部定义引用覆盖,所有的定义和引用之间的路径都覆盖过
逻辑测试
- 判定:每一个条件组为一个判定,影响控制流
- 条件:每一个布尔单元都是一个条件
- 判定覆盖:判定为True和False各执行一遍的覆盖
- 条件覆盖:每一个条件为True和False各执行一遍的覆盖
- 条件判定覆盖:同时满足条件覆盖和判定覆盖
- 完全条件覆盖:所有条件的组合覆盖,复杂度为 2n 次
- 修订条件/判定覆盖(MC/DC):每一个条件的独立影响都要执行一次
变异测试
在正常程序中注入Fault之后观察测试用例是否将Fault检测出来。用于评估测试用例集的充分性。
变异测试假设:
- 程序员不可能大面积写错代码,只会不小心写错小部分代码
- 如果单一错误可以测试到,那么组合的错误就可以被测试到
重要的变异类型:
类型 | 描述 | 集合描述 | 数量 |
---|---|---|---|
ABS | 绝对值 | { (e,abs(e)),(e,−abs(e))} | 2 |
AOR | 算数运算符 | { (x,y)∣x,y∈{ +,−,∗,/,%}∧x≠y} | 20 |
LCR | 逻辑连接符 |