代码覆盖
被测试的程序
IF ((A > 1) AND (B == 0)) THEN
X = X / A
IF ((A == 2) OR (X > 1) THEN
X = X + 1
语句覆盖
定义:程序中的每条可执行语句都能被执行到
A=2, B=0, X=4
判定覆盖,也叫分支覆盖
定义:程序中每个判断语句的的真值和假值至少执行一次。每个判定有T有F
测试输入 | 判定1: (a > 1) && (b == 0) | 判定2: (a == 2) || (x > 1) |
---|---|---|
{a=2, b=0, x=2} | T | T |
{a=1, b=1, x=1} | F | F |
满足判定覆盖的一定可以满足语句覆盖
条件覆盖
定义:程序中每个条件的真值和假值至少执行一次。即( A > 1),( B = =0 ),( A == 2), ( X > 1 )都至少一次真假,每个条件有T有F
{a=1, b=0, x=3} | {a=2, b=1, x=1} | ||
---|---|---|---|
判定1: (a > 1) && (b == 0) | 条件1 : a > 1 | F | T |
条件2: b == 0 | T | F | |
判定1的结果 | F | F | |
判定2: (a == 2) || (x > 1) | 条件3: a == 2 | F | T |
条件4: x > 1 | T | F | |
判定2的结果 | T | T |
条件覆盖不能保证判定覆盖。
判定/条件覆盖
定义:每个判定的真值和假值至少执行一次,并且每个条件的真假和假值也至少执行一次。
每个判定和条件有T有F。
{a=2, b=0, x=4} | {a=1, b=1, x=1} | ||
---|---|---|---|
判定1: (a > 1) && (b == 0) | 条件1 : a > 1 | T | F |
条件2: b == 0 | T | F | |
判定1的结果 | T | F | |
判定2: (a == 2) || (x > 1) | 条件3: a == 2 | T | F |
条件4: x > 1 | T | F | |
判定2的结果 | T | F |
条件组合覆盖
定义:每个判定的条件取值组合至少能被覆盖一次。
对条件进行排列组合
{a=2, b=0, x=2} | {a=2, b=1, x=1} | {a=1, b=0, x=2} | {a=1, b=1, x=1} | ||
---|---|---|---|---|---|
判定1: (a > 1) && (b == 0) | 条件1 : a > 1 | T | T | F | F |
条件2: b == 0 | T | F | T | F | |
判定1的结果取值 | T | F | F | F | |
判定2: (a == 2) || (x > 1) | 条件3: a == 2 | T | T | F | F |
条件4: x > 1 | T | F | T | F | |
判定2的结果取值 | T | T | T | F |
路径覆盖
定义:程序中每条路径都能尽量被覆盖至少一次。路径覆盖不一定满足条件组合覆盖。
{a=2, b=0, x=2} | {a=2, b=1, x=1} | {a=1, b=0, x=1} | {a=3, b=0, x=1} | ||
---|---|---|---|---|---|
判定1: (a > 1) && (b == 0) | 条件1 : a > 1 | T | T | F | T |
条件2: b == 0 | T | F | T | T | |
判定1的结果取值 | T | F | F | T | |
判定2: (a == 2) || (x > 1) | 条件3: a == 2 | T | T | F | F |
条件4: x > 1 | T | F | F | F | |
判定2的结果取值 | T | T | F | F | |
覆盖路径 | abd | acd | ace | abe |
六种覆盖技术从弱到强的排列顺序是:
语句覆盖->判定覆盖->条件覆盖->判定-条件覆盖->条件组合覆盖->路径覆盖
等价类设计
有效等价类
对于程序的规格而言是有意义、合理的数据输入的集合,用于测试程序是否实现了规格说明中约定的功能和性能要求。
无效等价类
对于程序的规格说明而言是不合理的数据输入,用于测试程序是否能经受得起非法输入的考验。
原则
原则1:输入条件是一个布尔量,可获得一个有效等价类和一个无效等价类。
有效等价类 | 无效等价类 |
---|---|
1:高电平 | 0:低电平 |
原则2:输入条件规定的取值范围是一个闭合区间,可获得一个有效等价类和两个无效等价类;如果取值范围为开区间,则可获得一个有效等价类和一个无效等价类
有效等价类 | 无效等价类 |
---|---|
0 <= 索引范围 <=99 | 索引范围 < 0 |
索引范围 >99 |
原则3:输入条件规定了输入数据必须遵守的规则,可获得一个符合所有规则的有效等价类和若干个从不同角度违反规则的无效等价类
有效等价类 | 无效等价类 |
---|---|
长度为6位的全数字组合 | 长度大于6位的全数字组合 |
长度小于6位的全数字组合 | |
非全数字组合 |
原则4:输入条件规定了输入数据的一组n个值且分别处理,可获得n个有效等价类和一个无效等价类
有效等价类 | 无效等价类 |
---|---|
硕士生 | 其他人员 |
博士生 |
等价类设计
某网管用户登录界面要求输入用户ID和密码才能登录,对该用户登录功能进行测试。
用户ID、密码要求不能为空。
用户ID为4位数字,不能以“0”开头;
用户密码为6位数字,不能以“0”开头。
有效等价类 | 等价类编号 | 无效等价类 | 等价类编号 | |
---|---|---|---|---|
用户ID | 非空 | 1 | 为空 | 7 |
数字 | 2 | 非数字 | 8 | |
4位数字 | 3 | 小于4位数字 | 9 | |
大于4位数字 | 10 | |||
不能以0开头 | 以0开头 | 15 | ||
密码 | 非空 | 4 | 为空 | 11 |
数字 | 5 | 非数字 | 12 | |
6位数字 | 6 | 小于6位数字 | 13 | |
大于6位数字 | 14 | |||
不能以0开头 | 以0开头 | 16 |
第一步:设计用例,覆盖尽可能多的有效等价类
用例ID | 用户ID | 用户密码 | 覆盖有效等价类编号 |
---|---|---|---|
1 | 2345 | 762532 | 1,2,3,4,5,6 |
第二步:设计用例,使其只覆盖一个等价类
用例ID | 用户ID | 用户密码 | 覆盖无效等价类编号 |
---|---|---|---|
2 | 762532 | 7 | |
3 | Ad34 | 332432 | 8 |
4 | 213 | 324355 | 9 |
5 | 23467 | 115321 | 10 |
6 | 1222 | 11 | |
7 | 1222 | Yta2ds | 12 |
8 | 1222 | 12345 | 13 |
9 | 1222 | 1234567 | 14 |
设计一个新的测试用例,使其尽可能多的覆盖尚未被覆盖的有效等价类,重复这一步,直到所有的有效等价类都被覆盖
设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖
也就是说,设计无效等价类用例的时候,每次只满足一个无效等价类,不可以同时满足多个无效等价类,遵从单一原则
边界测试的用例设计
项 | 边界值 | 测试用例的设计思路 |
---|---|---|
字符 | 起始-1个字符/结束+1个字符 | 假设一个文本输入区域允许输入1个到255个字符,输入1个和255个字符作为有效等价类;输入0个和256个字符作为无效等价类,这几个数值都属于边界条件值。 |
数值 | 最小值-1/最大值+1 | 假设某软件的数据输入域要求输入5位的数据值,可以使用10000作为最小值、99999作为最大值;然后使用刚好小于5位和大于5位的 数值来作为边界条件。 |
空间 | 小于空余空间一点/大于满空间一点 | 例如在用存储数据时,使用比剩余磁盘空间大一点(几KB)的文件作为边界条件。 |
阈值 | 小于阈值一点/大于阈值一点 | 例如系统运维监控告警系统提供磁盘利用率告警功能,比阈值(95%)小一点94.9%和95.1%作为边界条件 |