假设我们有以下待测试程序 :
python
def func(a, b, x):
if a > 1 and b == 0:
x = x / a
if a == 2 or x > 1
x = x + 1
return x
语句覆盖
语句覆盖:每条语句至少执行一次。
使用此准则测试上述函数, 只需要遍历路径 ace
, 即可使得所有语句执行一次。
对应测试用例为 : a = 2, b = 0, x = 4
。
判定覆盖
判定覆盖:又叫分支覆盖, 每个判定的所有可能结果至少出现一次。
只需要涵盖路径 ace
和 abd
, 或 acd
和 abe
, 就可以使得两个判定为 "真" 和 "假" 的分支都执行一次。
前者 :
a = 2, b = 0, x = 4
->ace
√ √a = 0, b = 1, x = 1
->abd
× ×
后者 :
a = 2, b = 0, x = 1
->acd
√ ×a = 2, b = 1, x = 2
->abe
× √
条件覆盖
条件覆盖:每个条件的所有可能结果至少执行一次。
第一个判断的所有条件的可能取值情况 : <math xmlns="http://www.w3.org/1998/Math/MathML"> a > 1 a > 1 </math>a>1 或 <math xmlns="http://www.w3.org/1998/Math/MathML"> a ≤ 1 a \leq 1 </math>a≤1, <math xmlns="http://www.w3.org/1998/Math/MathML"> b = 0 b = 0 </math>b=0 或 <math xmlns="http://www.w3.org/1998/Math/MathML"> b ≠ 0 b \neq 0 </math>b=0。
第二个判断的所有条件的可能取值情况 : <math xmlns="http://www.w3.org/1998/Math/MathML"> a = 2 a = 2 </math>a=2 或 <math xmlns="http://www.w3.org/1998/Math/MathML"> a ≠ 2 a \neq 2 </math>a=2, <math xmlns="http://www.w3.org/1998/Math/MathML"> x > 0 x > 0 </math>x>0 或 <math xmlns="http://www.w3.org/1998/Math/MathML"> x ≤ 1 x \leq 1 </math>x≤1。
-
a = 1, b = 0, x = 3
: 触发 <math xmlns="http://www.w3.org/1998/Math/MathML"> a ≤ 1 a \leq 1 </math>a≤1 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> b = 0 b=0 </math>b=0 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> a ≠ 2 a \neq 2 </math>a=2 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> x > 1 x > 1 </math>x>1。(出于简单起见, 这里不考虑逻辑中断的发生) -
a = 2, b = 1, x = 1
: 触发 <math xmlns="http://www.w3.org/1998/Math/MathML"> a > 1 a > 1 </math>a>1 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> b ≠ 0 b \neq 0 </math>b=0 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> a = 2 a = 2 </math>a=2 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> x ≤ 1 x \leq 1 </math>x≤1。
组合覆盖
组合覆盖:每个判定中的所有可能的条件结果的组合,以及所有的入口点都至少执行一次。(注意"可能"二字,因为有些组合的情况难以生成。)
为了满足组合条件覆盖的测试用例, 必须覆盖以下八种组合。
a = 2, b = 0, x = 4
: 覆盖 1 + 5a = 2, b = 1, x = 1
: 覆盖 2 + 6a = 1, b = 0, x = 2
: 覆盖 3 + 7a = 1, b = 1, x = 1
: 覆盖 4 + 8