条件测试是检查程序模块中包含逻辑条件的测试用例设计方法。(逻辑条件就是非,<,>,=等等)
条件测试作用:
发现以下类型的错误:
布尔操作符错误:操作符遗漏、多余或者不正确,指&、|、! 运用错误。
布尔变量错误:例如 (x>y)写出(x>z)。
布尔括弧错误:例如 (x+y)*z少些括弧变成x+y*z。
关系操作符错误:例如 x>y写出x>=y。
算术表达式错误:例如 x*y写成xy。
条件测试优点:
条件测试的覆盖率度量最简单。
程序的各个条件测试覆盖率为产生另外的程序测试提供了指导。
条件测试策略:
1. 分支测试(最简单的条件测试):
分支测试可能是最简单的条件测试策略,它是真假分支必须至少执行一次的路径策略,对于复合条件C,C的真分支和假分支以及C中的每个简单条件都需要至少执行一次。
域测试是对于大于、小于和等于值的测试路径策略。域测试要求从有理表达式中导出三个或四个测试,有理表达式的形式如:
E1<关系操作符>E2
需要三个测试分别用于计算E1的值是大于、等于或小于E2的值。如果<关系操作符>错误,而E1和E2正确,则这三个测试能够发现关系算子的错误。为了发现E1和E2的错误,计算E1小于或大于E2的测试应使两个值间的差别尽可能小。
2. 穷举测试(条件组合)
有n个变量的布尔表达式需要2n个可能的测试(n>0)。这种策略可以发现布尔操作符、变量和括弧的错误,但是只有在n很小时实用。
3. BRO策略:
如果在一个判定的复合条件表达式中每个布尔变量和关系运算符最多只出现一次,而且没有公共变量,应用一种称之为BRO(分支与关系运算符)的测试法可以发现多个布尔运算符或关系运算符错,以及其他错误。
BRO策略引入条件约束的概念。设有n个简单条件的复合条件C,其条件约束为D= (D1,D2,…,Dn) ,其中Di(0<i≤n)是条件C中第i个简单条件的输出约束。如果在C的执行过程中,其每个简单条件的输出都满足D中对应的约束,则称条件C的条件约束D由C的执行所覆盖。对于布尔变量或布尔表达式B,B的输出约束必须是真(t)或假(f);对于关系表达式,其输出约束为符号>、=、< 。
其输出为(t,<,>,=)。
C1: B1 & B2 要求约束集{(t,t),(t,f),(f,t)}由C1的执行覆盖。如果C1由于布尔操作符的错误而不正确,至少有一个约束C1失败。
对于C1: B1 & B2 约束集不包含(f,f)的原因如下:
引入:
对于单个变量的情况,例如 if(x) 。
错误情况只有一种,即错将x写成其他变量y。
则有以下情况:
x | y |
0 | 0 |
0 | 1 |
1 | 0 |
1 | 1 |
发现:
因为担心错将变量写错,所以只需要找出与正确情况相反的部分即可,即标红部分。
假定写错,只需要测试 y 取{(0),(1)}就可以得出到底有无错误。因为测试其他的结果一样,得不出错误。
对于 C1: B1 & B2 :
第一步:
考虑第一个变量写错,即错将 x&y 写成 z&y。
x&y—>z&y 第一个变量写错:
x | y | z | x&y | z&y |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 0 |
0 | 1 | 0 | 0 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 0 |
1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
发现:
错将x写成z之后,(x,y) 与 (z,y) 只有图中标红部分结果不一样,即(0,1)和(1,1)、(1,1)和(0,1)
假定写错,只需要测试 z&y 取值为{ ( 1 , 1 ) , ( 0 , 1 ) },即 ( t , t ) , ( f , t ),就包含了所有可能错的情况,因为其他情况结果相同。
第二步:
考虑第一个变量写错,即错将 x&y 写成 x&z。
x&y—>x&z 第二个变量写错:
x | y | z | x&y | x&z |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 0 |
0 | 1 | 0 | 0 | 0 |
0 | 1 | 1 | 0 | 0 |
1 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
发现:
错将x写成z之后,(x,y) 与 (x,z) 只有图中标红部分结果不一样,即(1,1)和(1,1)、(1,1)和(1,0)
假定写错,只需要测试 x&z 取值为{ ( 1 , 1 ) , ( 1 , 0 ) },即 ( t , t ) , ( t , f ),就包含了所有可能错的情况,因为其他情况结果相同。
第三步:
布尔操作符写错,即错将 x&y 写成 x|y。
x&y —> x|y:
x | y | x&y | x|y |
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 |
发现:
错将 & 写成 | 之后,(x&y) 与 (x|z) 只有图中标红部分结果不一样,即(1,0)、(0,1)
假定写错, 只需要测试 x|y 取值为{ ( 0 , 1 ) , ( 1 , 0 ) },即 ( f , t ) , ( t , f ),就包含了所有可能错的情况,因为其他情况结果相同。
第四步:
考虑两个变量错误。
两个变量错误:
x | y | a | b | x&y | a&b |
0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 | 1 |
-------------------------------------------------------------------------------------- | |||||
0 | 1 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 0 | 0 |
0 | 1 | 1 | 0 | 0 | 0 |
0 | 1 | 1 | 1 | 0 | 1 |
--------------------------------------------------------------------------------- | |||||
1 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 1 | 0 | 1 |
------------------------------------------------------------------------------------ | |||||
1 | 1 | 0 | 0 | 1 | 0 |
1 | 1 | 0 | 1 | 1 | 0 |
1 | 1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 1 | 1 |
发现:
错将 & 写成 | 之后,(x&y) 与 (a|c) 只有图中标红部分结果不一样,即 (0,0)和(1,1)、(0,1)和(1,1)、(1,0)和(1,1)、(1,1)和(0,0)、(1,1)和(0,1)、(1,1)和(1,0) 。
前三个错误都是期望0,实际1;
后三个错误都是期望1,实际0;
假定写错,前三种只需要测试 a&b 为(1,1),后三者选一个测试即可,但是为了减少测试量,选择第一步第二步第三步里面出现过的最好,即(0,1)或(1,0),这里选择(0,1).
因此只需要测试(1,1)和(0,1)即(t,t)和(f,t)即可。
依次类推即可。