白盒测试详细总结

测试文章内容,包含一些测试语句,因为不包含足够的词语,所以必须输入足够的语句,才能正常的入库处理。

白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,你清楚盒子内部的东西以及里面是如何运作的。”白盒”法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。”白盒”法是穷举路径测试。白盒测试并不是简单的按照代码设计用例,而是需要根据不同的测试需求,结合不同的测试对象,使用适合的方法进行测试。


白盒测试基本要求

  • 保证一个模块中的所有独立路径至少被执行一次;
  • 对所有的逻辑值均需要测试真、假两个分支;
  • 在上下边界及可操作范围内运行所有循环;
  • 检查内部数据结构以确保其有效性。

白盒测试用例设计的一个很重要的评估标准就是对代码的覆盖度白盒测试中常见的覆盖方法有六种:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖。下面我们就分别看看这几种不同的覆盖吧

语法

测试覆盖标准

  1. 语句覆盖:是一个比较弱的测试标准,它的含义是:选择足够的测试用例,使得程序中每个语句至少都能被执行一次
  • 它是最弱的逻辑覆盖,效果有限,必须与其它方法交互使用。
  1. 判定覆盖(也称为分支覆盖):执行足够的测试用例,使得程序中的每一个分支至少都通过一次
  • 判定覆盖只比语句覆盖稍强一些,但实际效果表明,只是判定覆盖,还不能保证一定能查出在判断的条件中存在的错误。因此,还需要更强的逻辑覆盖准则去检验判断内部条件。
  1. 条件覆盖:执行足够的测试用例,使程序中每个判断的每个条件的每个可能取值至少执行一次
  • 条件覆盖深入到判定中的每个条件,但可能不能满足判定覆盖的要求。
  1. 判定/条件覆盖:执行足够的测试用例,使得判定中每个条件取到各种可能的值,并使每个判定取到各种可能的结果
  2. 条件组合覆盖:执行足够的例子,使得每个判定中条件的各种可能组合都至少出现一次
  • 这是一种相当强的覆盖准则,可以有效地检
    查各种可能的条件取值的组合是否正确。
  • 它不但可覆盖所有条件的可能取值的组合,还可覆盖所有判断的可取分支,但可能有的路径会遗漏掉。
  • 测试还不完全。

一、语句覆盖(Statement Coverage)

  1. 主要特点:语句覆盖是最起码的结构覆盖要求,语句覆盖需要选择足够的测试用例,使我们设计出来的测试用例要保证程序中的每一个语句至少被执行一次
  2. 优点:可以很直观地从源代码得到测试用例,无须细分每条判定表达式。
  3. 缺点:由于这种测试方法仅仅针对程序逻辑中显式存在的语句,但对于隐藏的条件和可能到达的隐
    式逻辑分支,是无法测试的。
  4. 举例

public int foo(int a,int b)
{
      return a/b;
}

这是一个求两数之商的函数。如果我们设计如下的测试用例:
TestCase: a =2, b =1
此时,该函数的代码覆盖率达到了100%,并且设计的case可以顺利通过测试。但是显然该函数有一个很明显的bug:当
b=0 时,会抛出异常。

CREATE TRIGGER :(触发器名称) --触发器必须有名字,最多64个字符,可能后面会附有分隔符。它和MySQL中其他对象的明明方式基本相像。
BEFORE|ARIER   :--触发器有执行的时间设置:可设置为事件发生前后
INSERT|UPDATE|DELETE --同样也能设置触发的事件:它们可以在执行insert,uodate,或deleet的过程中触发。
ON             :(表名称)--触发器是属于某一个表的:挡在这个表上执行插入、更新或删除操作的时候就导致触发器的激活,我们不能给同一张表的同一个时间安排两个触发器。
FOR EACH ROW   :--触发器执行间隔 : FOR EACH ROW 子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。

主要方法

  1. 逻辑驱动测试
  • 语句覆盖
  • 判定覆盖
  • 条件覆盖
  • 判定/条件覆盖
  • 条件组合覆盖
  1. 路径测试
  • 路径测试就是设计足够多的测试用例,覆盖被测试对象中的所有可能路径。这是最强的覆盖准则。
  • 基本路径测试:设计足够多的测试用例,运行所测程序,要覆盖程序中所有可能的路径。但在路径数目很大时,真正做到完全覆盖是很困难的,必须把覆盖路径数目压缩到一定限度。例如程序中的循环体只执行一次。

二、判定覆盖(Decision Coverage)

  1. 主要特点:判定覆盖又称为分支覆盖,它要求选择足够的测试用例,使得运行这些测试用例时,每个判定的所有可能结果至少出现一次
  2. 优点:判定覆盖比语句覆盖要多几乎一倍的测试路径,当然也就具有比语句覆盖更强的测试能力。同样判定覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。
  3. 缺点:往往大部分的判定语句是由多个逻辑条件组合而成(如,判定语句中包含AND、OR、CASE),若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。
  4. 举例
![](https://upload-images.jianshu.io/upload_images/2298827-34f2268901fe3fb7.png)

X    Y   路径
90  90  OAE
50  50  OBDE
90  70  OBCE

(触发器SQL语句)–触发器包含索要触发的SQL语句:这里的语句可以是任何合法的语句,也包含符合语句,但是这里的语句收的限制和函数的一样。

语句覆盖

例1:

PROCEDURE  M(VAR A,B,X:REAL);  
BEGIN 
IF ((A>1) AND (B=0))  THEN X:=X/A; 
IF ((A=2) OR (X>1))   THEN X:=X+1; 
END.

图片 1

流程图

为使程序中每个语句至少执行一次,只需设计一个能通过路径ace的例子就可以了,例如选择输入数据为:
A=2,B=0,X=3
从上例可看出,语句覆盖实际上是很弱的,如果第一个条件语句中的AND错误地编写成OR,上面的测试用例是不能发现这个错误的;又如第三个条件语句中X>1误写成X>0,这个测试用例也不能暴露它,此外,沿着路径abd执行时,X的值应该保持不变,如果这一方面有错误,上述测试数据也不能发现它们。

例2:

void  DoWork(int x,int y,int z)
{  int  k=0,j=0;
   if((x>3)&&(z<10))
   {  k=x*y-1;     //语句块1
      j=sqrt(k);
   }
   if((x= =4)||(y>5))
   {  j=x*y+10;   //语句块2
   }
   j=j%3;             //语句块3
}

图片 2

流程图

为了测试语句覆盖率只要设计一个测试用例就可以把三个执行语句块中的语句覆盖了。测试用例输入为:x=4、y=5、z=5,程序执行的路径是:abd
该测试用例虽然覆盖了可执行语句,但并不能检查判断逻辑是否有问题,例如在第一个判断中把&&错误的写成了||,则上面的测试用例仍可以覆盖所有的执行语句。

三、条件覆盖(Condition Coverage)

  1. 主要特点:要求所设计的测试用例能使每个判定中的每一个条件都获得可能的取值,即每个条件至少有一次真值、有一次假值。
  2. 优点:显然条件覆盖比判定覆盖,增加了对符合判定情况的测试,增加了测试路径。条件覆盖使得判定中的每一个条件都取到了不同的结果,这一点判定覆盖则无法保证。
  3. 缺点:要达到条件覆盖,需要足够多的测试用例,但条件覆盖并不能保证判定覆盖。条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。
  4. 举例

X    Y   路径
90  70  OBC
40        OBD

–你必须拥有相当大的权限才能创建触发器(CREATE
TRIGGER),如果你已经是ROOT用户了,那么久足够了。这跟SQL的标准有所不同。

判定覆盖

例1:
如果设计两个例子,使它们能通过路径ace和abd,或者通过路径acd和abe,就可达到“判定覆盖”标准,为此,可以选择输入数据为:
① A=3,B=0,X=1(沿路径acd执行)
② A=2,B=1,X=3(沿路径abe执行)
例2:
如果设计两个测试用例则可以满足条件覆盖的要求。测试用例的输入为:
x=4、y=5、z=5【a b d】
x=2、y=5、z=5【a c e】
上面的两个测试用例虽然能够满足条件覆盖的要求,但是也不能对判断条件进行检查,例如把第二个条件y>5错误的写成y<5,、上面的测试用例同样满足了分支覆盖。
注意:程序中含有判定的语句包括IF-THEN-ELSE、DO-WHILE、REPEAT-UNTIL等,除了双值的判定语句外,还有多值的判定语句,如PASCAL中的CASE语句、FORTRAN中带有三个分支的IF语句等。所以“分支覆盖”更一般的含义是:使得每一个分支获得每一种可能的结果

参考文献:

谈谈白盒测试中的几种覆盖方法

实例
创建表tab1

条件覆盖

一个判定中往往包含了若干个条件,如例1的程序中,判定 (A>1) AND
(B=0)包含了两个条件: A>1以及
B=0,所以可引进一个更强的覆盖标准——“条件覆盖”。

  • 例1的程序有四个条件:
    A>1、 B=0、A=2、X>1
    为了达到“条件覆盖”标准,需要执行足够的测试用例使得在a点有:
    A>1、A≤1、B=0、B≠0 等各种结果出现,以及在b点有:
    A=2、A≠2、X>1、X≤1 等各种结果出现。
    现在只需设计以下两个测试用例就可满足这一标准:
    ① A=2,B=0,X=4 (沿路径ace执行)
    ② A=1,B=1,X=1 (沿路径abd执行)

  • 对例2中的所有条件取值加以标记。

  • 对于第一个判断:
    条件x>3 取真值为T1,取假值为-T1
    条件z<10 取真值为T2,取假值为-T2

  • 对于第二个判断:
    条件x=4 取真值为T3,取假值为-T3
    条件y>5 取真值为T4,取假值为-T4

  • 则可以设计测试用例如下

![](https://upload-images.jianshu.io/upload_images/938465-207afe4db61770e8.png)

条件覆盖测试用例



注意:
  • “条件覆盖”通常比“分支覆盖”强,因为它使一个判定中的每一个条件都取到了两个不同的结果,而判定覆盖则不保证这一点。

  • “条件覆盖”并不包含“分支覆盖”,如对语句IF(A AND B)THEN S
    设计测试用例使其满足”条件覆盖”,即使A为真并使B为假,以及使A为假而且B为真,但是它们都未能使语句S得以执行。

如对例2设计了下面的测试用例,则虽然满足了条件覆盖,但只覆盖了第一个条件的取假分支和第二个条件的取真分支,不满足分支覆盖的要求。

图片 3

测试用例

DROP TABLE IF EXISTE tab1;
CREATE TABLE tab1(tab1_id vachar(11));

分支(判定)/条件覆盖

针对上面的问题引出了另一种覆盖标准——“分支(判定)/条件覆盖”,它的含义是:执行足够的测试用例,使得分支中每个条件取到各种可能的值,并使每个分支取到各种可能的结果。

  • 对例1的程序,前面的两个例子
    ① A=2,B=0,X=4 (沿ace路径)
    ② A=1,B=1,X=1 (沿abd路径)
    是满足这一标准的。
  • 对例2,根据定义只需设计以下两个测试用例便可以覆盖8个条件值以及4个判断分支。
![](https://upload-images.jianshu.io/upload_images/938465-2838323b3da2208e.png)

分支(判定)/条件覆盖测试用例



分支/条件覆盖从表面来看,它测试了所有条件的取值,但是实际上某些条件掩盖了另一些条件。
  • 例如对于条件表达式(x>3)&&(z<10)来说,必须两个条件都满足才能确定表达式为真。
  • 如果(x>3)为假则一般的编译器不在判断是否z<10了。对于第二个表达式(x==4)||(y>5)来说,若x==4测试结果为真,就认为表达式的结果为真,这时不再检查(y>5)条件了。
  • 因此,采用分支/条件覆盖,逻辑表达式中的错误不一定能够查出来了。