白盒测试:关注源代码和程序结构。
优势:
- 针对性强,测试效率高,通过不同的白盒覆盖指标有助于衡量对被测对象的测试覆盖程度。
- 在函数级别开始测试工作,缺陷修复的成本低
局限性:对测试人员的技术要求高,没有一定编程经验的人是无法做白盒测试的
适用阶段:
测试对象为函数时, 对应的是单元测试阶段,主要由开发人员自己来完成测试工作。
测试对象为功能时,对应的是集成测试甚至系统测试阶段,主要由测试人员来完成测试工作
3.4.1 语句覆盖
语句覆盖法:设计若干测试用例,运行被测程序,使程序中的每个可执行语句至少被执行一次。
缺陷:发现不了判定中逻辑运算的错误,不是一种充分的检验方法。只在乎是否完成运行,不考虑其他情况。
eg:
(a,b,c)=(1,1,2)可以执行所有语句。但是如果将逻辑符号and或or输入错误则无法执行。
语句覆盖是最弱的逻辑覆盖标准。
优点:直观地从代码中得到测试用例,无须细分每条判定表达式。
3.4.2 判定覆盖
判定覆盖法:设计若干用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断真假值均曾被满足。
eg:
两个测试用例可以满足每个判定的真假值均被满足一次。
优点:比语句覆盖更强的测试能力。
缺点:无法确定判断内部条件的错误(若是某一条件错误,测试用例仍能通过)。容易遗漏部分测试路径。
3.4.3 条件覆盖
条件覆盖:设计若干测试用例,执行被测程序以后,要使每个判断中每个条件的可能取值至少满足一次(每个条件)。
eg: 首先列出所有条件
四个条件的真假全覆盖。
优点:比判定覆盖增加了对符合判定情况的测试,增加了测试路径。
缺点:不能保证判定覆盖(无法考虑所有判定结果)。
3.4.4 判定-条件覆盖
判定-条件覆盖:判定和条件覆盖设计方法的交集,即设计足够的测试用例,使得判断条件中的所有条件可能取值至少执行一次,同时,所有判断的可能结果至少执行一次。
eg.
所有条件的真假和判定结果的真假都要执行一次。
3.4.4 条件组合测试
条件组合覆盖:设计足够的测试用例,使得判断中每个条件的所有可能至少出现一次(它不是简单地要求每个条件都出现“真”与“假”两种结果,而是要求让这些结果的所有可能组合都至少出现一次),并且每个判断本身的判定结果也至少出现一次。
eg:首先列出条件所有组合
3.4.6 基本路径覆盖
路径覆盖:设计所有的测试用例,来覆盖程序中的所有可能的执行路径。
基本路径覆盖的设计过程:
-
画出控制流图
-
计算环复杂度
①流图中区域的数量(封闭+开放) = 环形复杂度
②V = E - N+ 2; E是边数 N是节点数
③v = P + 1; P是判定节点数 -
基本复杂度:通过对程序图中的结构化设计节点进行不断压缩,最终得到一个无法压缩的程序图,该图的环复杂度就称为基本复杂度
-
独立路径抽取:
环复杂度 = 独立路径条数
①确定主路径:该路径应包含尽可能多的判定节点
应包含尽可能复杂的判定表达式
应对应尽可能高的执行概率
应包含尽可能多的语句
②根据基础路径抽取其他独立路径
eg:A、B、C为判定点
Path1:A, B, C, G(经过判定节点A、B、C);
Path2:A, D, E, F, G(在判定节点A处执行e2分支);
Path3:A, B, E, F, G(在判定节点B处执行e5分支);
Path4:A, B, C, B, C, G(在判定节点C处执行e3分支);
Path5:A, D, F, G(在判定节点D处执行e7分支)
覆盖判定点的每条路径
测试用例设计步骤:
- 根据程序源代码生成程序图
- 计算程序图的环复杂度,确定独立路径集合的大小
- 以最复杂的路径为基础路径,通过覆盖所有判定分支确定其他路径,抽取独立路径集合
- 注意剔除不可行路径(程序的设计缺陷导致不可行路径),必要时补充其他重要的路径
- 根据得到的路径集合对应设计测试用例
注:基本路径测试并不是测试所有路径的组合,仅仅保证每条基本路径被执行一次
3.4.7 循环测试
循环测试:在循环内部及边界上执行测试
循环分为四种:简单循环、嵌套循环、连锁循环和非结构循环
- 简单循环(迭代次数n)
测试方法:
1.完全跳过循环
2.只经过循环一次
3.经过循环两次
4.经过循环m( m < n )次
5.分别经过循环n-1, n, n+1 次
- 嵌套循环
测试方法:在最里面的循环完成前面所述的简单循环测试,同时设定外部循环的最小迭代次数,逐步向外循环进行,直到所有循环被测试
- 连锁循环(串行连接的循环)
独立循环–》可以分别看着简单循环测试
依赖性循环–》可以看着是嵌套循环