白盒测试
白盒测试又称为结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。盒子指的是被测试的软件,白盒指的是盒子是可视的,测试人员清楚盒子内部的东西以及里面是如何运作的。
语句覆盖
主要特点: 语句覆盖是最起码的结构覆盖要求,语句覆盖要求设计足够的测试用例,使得程序中每条语句至少被执行一次。
优点: 可以很直观地从源代码得到测试用例,无需细分每条判定表达式。
缺点: 由于这种测试方法仅仅针对程序逻辑中显式存在的语句,对于隐藏的条件和可能到达的隐式逻辑分支,是无法测试的。在上面的例子中,两个判断条件都只测试了条件为真的情况,如果条件为假时处理有错误显然不能发现。
语句覆盖对于多分支的逻辑运算是无法全面反映的,它只在乎运行一次,而不考虑其他情况。
判定覆盖
主要特点: 判定覆盖又称为分支覆盖,它要求设计足够多的测试用例,使得程序中每个判定至少有一次为真值,有一次为假值,即程序中的每个分支至少执行一次。每个判断的取真、取假至少执行一次。
优点: 判定覆盖测试了每个分支的情况,当然也就具有比语句覆盖更强的测试能力。同样,判定覆盖也具有和语句覆盖一样的简单性,无需细分每个判定中的每个条件就可以得到测试用例。
缺点: 往往大部分的判断语句是由多个逻辑条件组合而成(如判断语句中包含AND、OR、CASE),若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然不易发现代码中的错误。
条件覆盖
主要特点: 条件覆盖要求设计足够多的测试用例,使得判定中的每个条件获得各种可能的结果,即每个条件至少有一次为真值,有一次为假值。
- 在 a 点有下述各种结果出现:A>1,A≤1,B=0,B≠0(A=2,B=0,X=4:sacbed路径)
- 在 b 点有下述各种结果出现:A=2,A≠2,X>1,X≤1(A=1,B=1,X=1:sabd路径)
优点: 显然条件覆盖比判定覆盖要强,因为它使判定表达式中的每个条件都取得了各个不同的结果,判定覆盖却只关心整个判定表达式的值。例如,上面两组测试数据也同时满足判定覆盖标准。
缺点: 要达到条件覆盖,需要足够多的测试用例,但条件覆盖并不能保证判定覆盖。条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。
判定/条件覆盖
主要特点: 设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身所有可能结果也至少出现一次。
优点: 判定/条件覆盖满足判定覆盖准则和条件覆盖准则,弥补了二者的不足。
缺点: 判定/条件覆盖准则的缺点是未考虑条件的组合情况。
条件组合覆盖
主要特点: 条件组合覆盖是更强的逻辑覆盖标准,要求设计足够多的测试用例,使得每个判定中条件结果的所有可能组合至少出现一次。
①A>1,B=0;②A>1,B≠0;③A≤1,B=0;④A≤,B≠0;⑤A=2,X>1;⑥A=2,X≤1;⑦A≠2,X>1;⑧A≠2,X≤1
- A=2,B=0,X=4(针对①、⑤组合;执行sacbed路径)
- A=2,B=2,X=1(针对②、⑥组合;执行sabed路径)
- A=1,B=0,X=2(针对③、⑦组合;执行sabed路径)
- A=1,B=1,X=1(针对④、⑧组合;执行sabd路径)
优点: 显然满足条件组合标准的测试数据也一定满足判定覆盖、条件覆盖和判定/条件覆盖准则。因此,条件组合覆盖是前述几种覆盖标准中最强的。
缺点: 线性地增加了测试用例的数量。
基本路径覆盖
主要特点: 设计足够的测试用例,,覆盖程序中所有可能的路径。也就是说,使得程序的每条可能路径都至少执行一次。若流程图中有环,则每个环至少经过一次。
优点: 路径覆盖是相当强的逻辑标准,它保证程序中的每条可能的路径都至少执行一次,因此这样的测试数据更有代表性,暴露错误的能力也比较强。这种测试方法可以对程序进行彻底的测试,比较前五种的覆盖面都广。
缺点: 由于路径覆盖需要对所有可能的路径进行测试(包括循环、条件组合、分支选择等),那么需要设计大量、复杂的测试用例,使得工作量呈指数级增长。
为了做到路径覆盖,只需考虑每个判定表达式的取值,并没有检验表达式中条件的各种可能组合情况。如果把路径覆盖和条件覆盖结合起来,可以设出检错能力更强的测试数据。对上述例子,只要把路径覆盖的第三组测试数据和前面给出的条件组合覆盖的四组数据联合起来,就可以做到即满足路径覆盖标准又满足条件组合覆盖标准。
数据流测试
数据流测试: 指关注变量接受值得点和使用(引用)这些值的点的结构性测试形式。
数据流测试发现 的缺陷: ①变量被定义,但是从来没有使用;
②所使用的变量没有被定义;
③变量在使用之前被定义两次。
定义节点: 当且仅当变量 v 的值由对应节点 n 的语句片段处定义。
(输入语句、赋值语句、循环控制语句和过程调用,都是定义节点语句的例子)。
执行定义语句,该变量所关联的存储单元的内容保持不变。
使用节点: 当且仅当变量 v 的值在对应节点 n 的语句片段处使用。
(输出语句、赋值语句、条件语句、循环控制语句和过程调用,都是使用节点语句的例子)。
执行定义语句,该变量所关联的存储单元的内容保持不变。
谓词使用: 外度≥2,条件语句、循环控制语句
计算使用: 外度≤1,计算表达式
定义-使用路径: 某个路径,定义节点DEF(v, n) 为该路径的起始起点,使用节点 USE(v, n) 为该路径的终止节点。
定义-清除路径: 如果变量 v 的某个定义-使用路径,除了起始节点之外没有其他定义的节点,则该路径是变量 v 的定义-清除节点。
void f(int x,int y,int m){
w = x;
if(m > 0)
w++;
else
w = w + 2;
if(y <= 10)
x = 5 * y;
else
x = 3 * y + 5;
z = w + x;
}
产生测试用例: ①通过非路径分析得到测试用例
②寻找尚未测试过的路径并生成相应的测试用例;
③通过指定特定路径并生成相应的测试用例。
全定义覆盖准则: 测试路径需要覆盖所有定义点和任意一个使用点,用定义-清除路径扩展成测试路径。
全使用覆盖准则: 测试路径需要覆盖所有定义点和所有使用点,用定义-清除路径扩展成测试路径。
全定义-使用路径覆盖准则: 测试路径需要覆盖所有定义点到所有使用点的路径,用定义-清除路径扩展成测试路径。
白盒测试与黑盒测试比较
- 白盒测试的优点
①迫使测试人员去仔细思考软件的实现。
②可以检测代码中的每条分支和路径。
③揭示隐藏在代码中的错误。
④对代码的测试比较彻底。
⑤最优化。 - 白盒测试的缺点
①昂贵。
②无法检测代码中遗漏的路径和数据敏感性错误。
③不验证规格的正确性。 - 黑盒测试的优点
①对于较大的代码单元,黑盒测试的效率更高。
②测试人员不需要了解程序的细节。
③测试人员和编码人员相对独立。
④从用户的视角进行测试,很容易被理解和接受。
⑤有助于暴露任何规格不一致或有歧义的问题。
⑥测试用例的设计可以不必等到编码完成,可以在规格完成之后马上进行。 - 黑盒测试的缺点
①只有一小部分可能的输入被测试到,要测试每个可能的输入几乎是不可能的。
②没有清晰、简明的规格,测试用例很难设计。