软件测试与维护(六)White Box Text

软件测试与维护(六):White Box Test

白盒测试(White-Box Testing)

  • 基本原理:基于过程设计的控制结构导出测试用例。
  • 白盒测试分类
    • Control Flow-Testing
      • 逻辑分支覆盖法
        • 语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖
      • 路径法
        • 路径覆盖、基本(独立)路径测试法
    • DataFlow-Testing

控制流测试

逻辑分支覆盖法

1. 语句覆盖(statement)

  • 概念

    • 语句覆盖就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次
    • 这种覆盖又称为点覆盖,它使得程序中每个可执行语句都得到执行,但它是最弱的逻辑覆盖,效果有限,必须与其它方法交互使用。
  • 示例

    02-01

2. 判定覆盖(Decision Coverage, Branch Coverage)

  • 概念
    • 判定覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次。判定覆盖又称为分支覆盖

3. 条件覆盖(Condition Coverage)

  • 概念
    • 条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次
  • 关系
    • 条件覆盖深入到判定中的每个条件,但可能不满足判定覆盖

4. 判定/条件覆盖

  • 概念
    • 判定-条件覆盖要求设计足够的测试用例,使得判定中每个条件的所有可能 (真/假)至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次
  • 复合判定:改为单个条件判定

5. 条件组合覆盖

  • 概念

    • 条件组合覆盖就是设计足够的测试用例,运行被测程序,使得每个判断的所有可能的条件取值组合至少执行一次
  • 关系

    • 满足“条件组合覆盖”的测试用例是一定满足“判定覆盖”、“条件覆盖”和“判定-条件覆盖”的。
  • 示例

    02-02

路径法

1. 路径覆盖(Path Coverage)

  • 概念
    • 路径测试就是设计足够的测试用例,覆盖程序中所有可能的路径。这是最强的覆盖准则。但在路径数目很大时,真正做到完全覆盖是很困难的,必须把覆盖路径数目压缩到一定限度。
    • 保证程序中每条可能的路径都至少执行一次,因此更具代表性,暴露错误的能力也比较强。
    • 但为了做到路径覆盖,只需考虑每个判定式的取值组合,并没有检验表达式中条件的各种可能组合。如果将路径覆盖和条件组合覆盖结合起来,可以设计出检错能力更强的测试数据。
    • 路径表达式:$a(b+c)(d+e)f=abdf+abef+acdf+acef$

####2. 基本(独立)路径测试法

  • 概念
    • 独立路径:从入口到出口的路径,至少经历一个从未走过的边。这样形成的路径叫独立路径。
  • 步骤
    • 根据程序的逻辑结构画出程序框图
    • 根据程序框图导出流图
    • 计算流图G环路复杂度$V(G)$
      • 流图的区域数量应该对应于环复杂度
      • 给定流图G的环复杂度定义为:$V(G)=E-N+2$
        • E为流图中的边数量,N为流图中的节点数量
      • 给定流图G的环复杂度也可以定义为:$V(G)=P+1$
        • P为流图中的判断节点数量
    • 确定只包含独立路径的基本路径集
    • 设计测试用例

数据流测试

  • 含义:数据流测试使用控制流图来进行测试。

    • 能填补路径和分支测试的缝隙(span the gap between all paths and branch testing)
  • 数据对象类别:

    • (d):Defined, Created, Initialized
    • (k):Killed, Undefined, Released
    • (u):Used
      • (c):Used in a calculation
      • (p):Used in a predicate
  • 路径段(du Path Segments)

    • Def-use Association: $(x , d, u)$

      • x: 变量
      • d: 含有x定义的节点
      • u: 含有x使用的判断或语句
      • 路径段中不存在其它x的定义
    • 例子

      02-03

  • 数据流测试策略:ADUP(All du Paths)

    • 找出测试所有的du paths路径

终极示例

  • 其实就是课程作业啦…

【题目】

scanf("%d %d",&x, &y);
if (y < 0 and x>0)
    pow = -y;
else
    pow = y;
z = 1.0;
while (pow != 0) {
    z = z * x;
    pow = pow - 1;
}
if (y < 0 and z>0)
    z = 1.0 / z;
printf ("%f",z);

用判定条件覆盖法、基本路径法完成测试用例设计(要求画程序流程图和控制流图)

【答案】

  1. 程序流程图

    st=>start: start
    e=>end: end
    statement1=>operation: scanf("%d %d",&x, &y);
    cond1=>condition: if(y < 0 and x>0)
    statement2=>operation: pow = -y; 
    statement3=>operation: pow = y;
    statement4=>operation: z = 1.0;
    cond2=>condition: pow != 0
    statement5=>operation: z = z*x; pow = pow-1;
    cond3=>condition:  if (y < 0 and z>0)
    statement6=>operation: z = 1.0/z;
    statement7=>operation: printf("%f",z);
    
    st->statement1->cond1
    cond1(yes)->statement2->statement4
    cond1(no)->statement3->statement4
    statement4->cond2
    cond2(yes)->statement5->cond2
    cond2(no)->cond3
    cond3(yes)->statement6->statement7
    cond3(no)->statement7->e
  1. 控制流图

    graph LR
        id1((start,a))-->id2((b))
        id2--yes-->id3((c))
        id2--no-->id4((d))
        id3-->id5((e))
        id4-->id5
        id5-->id6((f))
        id6--yes-->id7((g))
        id7-->id6
        id6--no-->id8((h))
        id8--yes-->id9((i))
        id9-->id10((j))
        id8--no-->id10
        id10-->id11(k,end)
    
  2. 判定条件覆盖法

    $T_1: y<0;\ \ T_2: x>0;\ \ T_3: pow\ !=0;\ \ T_4:y<0;\ \ T_5:z>0$

    测试序号 测试情况 输入(x, y) 理想输出(z)
    1 $T_1T_2T_3\overline{T_3}T_4T_5$ (1, -1) 1.0
    2 $\overline{T_1}\overline{T_2}T_3\overline{T_3}\overline{T_4}\overline{T_5}$ (-1, 1) -1.0
  3. 基本路径法

    本因有四条基本路径,但由于判定1与判定3存在矛盾,所以无法找出四条基本路径的实际用例。

    测试序号 测试路径 输入(x, y) 理想输出(z)
    1 abdefhjk (1, 0) 1.0
    2 abdefgfhjk (-1, -1) -1.0
    3 abcefgfhijk (1, -1) 1.0
    4

 Previous
软件测试与维护(七)Unit Test 软件测试与维护(七)Unit Test
软件测试与维护(七):Unit Test单元测试基本概念单元测试的定义 定义:单元测试是对软件基本组成单元进行的测试。 时机:一般是在代码完成后由开发人员完成,QA人员辅助。 概念 单元:有明确的功能、性能定义、接口定义的软件设计最小单元–
Next 
软件测试与维护(五)Black Box Text 软件测试与维护(五)Black Box Text
软件测试与维护(五):Black Box Test动态黑盒测试(Black-Box Test)概念 不深入代码细节测试软件的方法称为动态黑盒测试。 动态(dynamic):程序在运行;黑盒(black-box):不知道如何运行。 动态黑盒测
  TOC