目录
步骤3:确定基本路径集合(即独立路径集合)。于是可确定5条独立的路径:
步骤4:为每一条独立路径各设计一组测试用例,以便强迫程序沿着该路径至少执行一次。
至此我们就将逻辑覆盖和基本路径讲完了,希望大家在这里面有所收获,整篇博客是在一边写一边构思的,如有错误欢迎在评论区指正
前言:
我单独开一篇博客来介绍一下白盒测试的逻辑覆盖法和基本路径法设计,待会也会写一篇黑盒的
白盒测试主要是检查程序的内部结构、逻辑、循环和路径。白盒测试的常用用例设计方法有逻辑覆盖和基本路径测试。
根据覆盖测试的目标不同,逻辑覆盖又可分为语句覆盖、判断覆盖、条件覆盖、判断/条件覆盖、条件组合覆盖及路径覆盖。
逻辑覆盖测试法
我们先设计一个代码块
//以下代码用于测试六种逻辑覆盖测试法
IntlogicExample(int x, int y){
int magic=0;
if(x>0&&y>0)
magic=x + y + 10; //语句1
else
magic = x + y - 10; //语句2
if(magic<)
magic=0; //语句3
return magic; //语句4
}
得到代码流程图:
语句覆盖
定义
语句覆盖要求设计足够多的测试用例,运行被测程序,使得程序中每条语句至少被执行一次。
实例
这里就能看到,语句实际上就是在判断节点的分支对应的路径,无论如何,语句覆盖多数情况下都只需要两个用例就可以跑完(变量够少) ,这里的测试数据也是不唯一的
测试用例编号 | 输入数据 | 预期输出 | 覆盖语句 |
---|---|---|---|
CASE1 | x=3 y=3 | magic=16 | 语句1、4 |
CASE2 | x=-3 y=0 | magic=0 | 语句2、3 |
但是
在这个实例中,无法判断运算中逻辑关系错误。当第一个判断语句if(x>0&&y>0)
被错写成if(x>0||y>0)
也能达到100%的语句覆盖,所以语句覆盖不能发现上述的逻辑错误。
判定覆盖
满足判定覆盖,则满足语句覆盖。
定义
判定覆盖,又称”分支覆盖“;要求设计足够多的测试用例,运行被测程序,使得程序中每个判断的”真“和”假“都至少被执行一次。
实例
在本例共有两个判断条件:if(x>0&&y>)
和if(magic<0)
测试用例编号 | 输入数据 | 预期输出 | 执行路径 |
---|---|---|---|
CASE1 | x=3 y=3 | magic=16 | b–>c–>e |
CASE2 | x=-3 y=0 | magic=0 | a–>c–>d–>e |
这里就能发现,在判定覆盖的方法下,我们聚焦的重点是判断框的数据,所以指标才是执行路径而非覆盖语句。
通过着两个测试用例,两个判断的真、假分支都已经被执行过,所以满足了判定覆盖的标准。
在这个实例中,无法判断运算中逻辑关系错误。当第一个判断语句if(x>0&&y>0)
被错写成if(x>0||y>0)
也能达到100%的语句覆盖,所以判定覆盖也无法发现上面的逻辑错误。
条件覆盖
定义
条件覆盖要求设计足够多的测试用例,运行被测程序,使得判定中的每个条件获得各种可能的结果;即每个条件至少有一次为真,有一次为假。(这个我一般是看变量数量来算条件数量)
实例
本例共有两个判断条件:if(x>0&&y>0)
和if(magic<0)
共计三个条件x>0、y>0、magic<0
测试用例编号 | 输入数据 | 预期输出 | 执行路径 |
---|---|---|---|
CASE1 | x=3(T) y=0(F) | magic=-1(T) | a–>c–>d–>e |
CASE2 | x=-3(F) y=15(T) | magic=2(F) | a–>c–e |
通过这两个测试用例,三个条件的各种可能取值都满足了一次,达到了100%条件覆盖的标准。
条件覆盖职能保证每个条件至少有一次为真,而不考虑所有的判定结果。因此条件覆盖不能保证满足判定覆盖。
判定-条件覆盖
同时满足判定覆盖和条件覆盖
定义
判定-条件覆盖要求设计足够多的用例,运行被测程序,使得被测程序中的每个判断本身的结果(真、假)至少满足一次,同时,每个逻辑条件的可能值也至少满足一次。即同时满足100%判定覆盖和100%条件覆盖的标准。
实例
测试用例编号 | 输入数据 | 预期输出 | 执行路径 |
---|---|---|---|
CASE1 | x=3(T) y=3(T) | magic=16(F) | b–>c–e |
CASE2 | x=-3(F) y=0(F) | magic=-1(T) | a–>c–>d–>e |
通过这两个测试用例,所有条件的可能取值都满足了一次,而且所有的判断本身的判定结果也都满足了一次。
判定-条件覆盖满足了判定覆盖准则和条件覆盖准则,弥补了二者的不足。但未考虑条件组合的情况。
条件组合覆盖
条件组合覆盖同时满足语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖
定义
条件组合覆盖要求设计足够多的测试用例,运行被测程序,使得被测程序中每个判定中条件结果的所有可能组合至少执行一次。
其测试用例需要注意三点:
1. 条件组合只针对同一个判断语句内存在多个条件的情况,让这些条件的取值进行笛卡尔乘积组合;
2. 不同的判断语句内的条件取值之间无须组合;
3. 对于单条件的判断语句,只需要满足自己所有的取值即可。
实例
这里的笛卡尔积操作就是针对x和y的真假互相组合:
测试用例编号 | 输入数据 | 预期输出 | 执行路径 |
---|---|---|---|
CASE1 | x=3(T) y=3(T) | magic=16(F) | b–>c–e |
CASE2 | x=-3(F) y=0(F) | magic=-1(T) | a–>c–>d–>e |
CASE3 | x=3(T) y=0(F) | magic=-1(T) | a–>c–>d–>e |
CASE4 | x=-3(F) y=15(T) | magic=2(F) | a–>c–>e |
通过这四个测试用例,程序中所有条件取值的组合都被满足了一次。
路径覆盖
100%满足路径测试,一定能100%满足判定覆盖标准,但并不一定能100%满足条件覆盖,也就不能满足100%条件组合覆盖。
定义
路径覆盖要求设计足够的测试用例,运行被测程序,覆盖程序中所有可能的路径。
实例
测试用例编号 | 输入数据 | 预期输出 | 执行路径 |
---|---|---|---|
CASE1 | x=3(T) y=3(T) | magic=16(F) | b–>c–e |
CASE2 | x=-3(F) y=0(F) | magic=-13(T) | a–>c–>d–>e |
CASE3 | x=-3(F) y=15(T) | magic=2(F) | a–>c->e |
本质上就是真-假、假-真、假-假 ,但是为什么没有b->c->d->e呢?,因为这条路径不可能实现
if(x>0&&y>0)
magic=x + y + 10; //语句1
else
magic = x + y - 10; //语句2
xy都>0(T),magic必然大于0(F).
通过这三个测试用例,所有可能的路径都被满足了一次。
至此,对白盒测试的逻辑覆盖法做了简答的介绍和演示。
接下来我们讲基本路径法:
这个简答多了
定义
基本路径测试法又称独立路径测试,是在程序控制流图的基础上,通过分析控制结构的环路复杂性,导出基本可执行路径集合,从而设计出相应的测试用例的方法。设计出的测试用例要保证在测试中程序的语句覆盖100%,条件覆盖100%。
基本路径测试法包括以下4个步骤:
(1) 画出程序的控制流图:描述程序控制流的一种图示方法;
(2) 计算程序的环形复杂性:McCabe复杂性度量;从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界;
(3) 导出测试用例;根据圈复杂度和程序结构设计用例数据输入和预期结果;
(4) 准备测试用例,确保基本路径集中的每一条路径的执行;
这个跟复习题里面的是一样的过程,我这里拿一个例子来讲:
代码段如下:
public void function(int x, int y, int z)
{
if ((y > 1) && (z == 0))
{
x = x/y;
}
if ((y == 2) || (x > 1))
{
x = x+1;
}
y = x + z;
}
步骤1:导出过程的控制流图:根据流程图分析结点:
(1)结点1:开始;
(2)(y>1)&&(z==0)为逻辑运算符 AND连接的复合条件表达式,需要改为单条件的判定,分解为2个结点,结点2:z==0;结点3:y>1;
(3)结点4:x=x/y;
(4)(y==2)||(x>1)为逻辑运算符 OR连接的复合条件表达式,需要改为单条件的判定,分解为2个结点,结点5:y==2;结点6:x>1;
(5)结点7:x=x+1;
(6)结点8:y=y+z
(7)结点9:结束。
步骤2:确定环形复杂性度量V(G):
有以下几种方法计算圈复杂度:
给定流图G的圈复杂度V(G),定义为V(G)=Area,Area是流程图中的区域数量(即为封闭区域数量+1);
给定流图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流 图中结点的数量;
给定流图G的圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定结点的数量。
(1)V(G)= 5 (个区域)[区域1:2-3-5;区域2:3-4-5;区域3:5-6-7;区域4:6-7-8;区域5:外部];
(2)V(G)=E–N+2=12–9+2=5;其中E为流图中的边数,N为结点数;
(3)V(G)=P+1=4+1=5;其中P为判定结点的个数。在流图中,结点2、3、5、6是判定结点。
步骤3:确定基本路径集合(即独立路径集合)。于是可确定5条独立的路径:
路径1:1-2-5-6-8-9
路径2:1-2-5-7-8-9
路径3:1-2-5-6-7-8-9
路径4:1-2-3-5-6-8-9
路径5:1-2-3-4-5-6-8-9
步骤4:为每一条独立路径各设计一组测试用例,以便强迫程序沿着该路径至少执行一次。
(1)路径1(1-2-5-6-8-9)的测试条件:
z≠0,y≠2,x<=1;
(2)路径2(1-2-5-7-8-9)的测试条件:
z≠0,y=2;
(3)路径3(1-2-5-6-7-8-9)的测试条件:
z≠0,y≠2,x>1;
(4)路径4(1-2-3-5-6-8-9)的测试条件:
z=0,y<=1,x<=1;
(5)路径5(1-2-3-4-5-6-8-9)的测试条件:
z=0,y>1&&y≠2,x<=1;
用例
基本路径覆盖法用例如下:
测试用例 | 输入 | 独立路径 |
CASE1 | x=1, y=1,z=1 | 1-2-5-6-8-9 |
CASE2 | x=2,y=2,z=1 | 1-2-5-7-8-9 |
CASE3 | x=2,y=1,z=1 | 1-2-5-6-7-8-9 |
CASE4 | x=1, y=1,z=0 | 1-2-3-5-6-8-9 |
CASE5 | x=1, y=3,z=0 | 1-2-3-4-5-6-8-9 |
至此我们就将逻辑覆盖和基本路径讲完了,希望大家在这里面有所收获,整篇博客是在一边写一边构思的,如有错误欢迎在评论区指正
标签:语句,magic,覆盖,白盒,路径,测试用例,条件 From: https://blog.csdn.net/m0_73302939/article/details/145064457