逻辑覆盖测试用例设计

实验目标

  • 能够依据程序画出程序流程图
  • 理解常用覆盖方法的内涵
  • 理解常用覆盖方法的强弱关系
  • 能够使用常用覆盖方法设计测试用例

背景知识

白盒测试通常采用静态测试方法和动态测试方法开展。动态测试是参照系统需求或测试规则,通过预先设计一组测试输入,并借助此输入动态运行程序,从而达到发现程序错误的过程。

覆盖是是动态测试中的一类有效测试方法,主要包括逻辑覆盖、基本路径测试等.其中,逻辑覆盖基于程序内部的逻辑结构,通过对程序逻辑结构的遍历实现程序的覆盖。依据覆盖源程序结构的详尽程度,可分为语句覆盖、判定覆盖、条件覆盖、条件判定覆盖、条件组合覆盖和路径覆盖六种类型

具体介绍如下

语句覆盖

语句覆盖是一类比较弱的测试标准,具体是指选择足够的测试用例,使程序中的每个语句至少能被执行一次。

局限性:测试不充分,对程序执行逻辑的覆盖率较低,属于最弱的覆盖方式。

判定覆盖

判定覆盖又称为分支覆盖,是比语句覆盖稍强的一类测试标准,具体是指选择足够的测试用例,使程序中的每个判定获得每一种可能的结果至少一次,也就是说,各个判定的每个分支至少都被执行一次

局限性:测试不充分,仅对整个判定的最终取值进行各方面的度量,但判定内部每一个子表达式的取值未被考虑

条件覆盖

条件覆盖是比判定覆盖更强的一类测试标准,具体是指选择足够的测试用例,使程序各判定中的每个条件获得可能的取值

局限性:测试不充分,虽弥补了判定覆盖的漏洞,对程序内部每一个子表达式的取值进行了度量,但条件覆盖并不能满足判定覆盖

条件判定覆盖

条件判定覆盖综合了判定覆盖和条件覆盖特点,是比条件覆盖更强的一类测试标准,具体视选择足够的测试用例,使程序中各判定的每个分支至少都被执行一次,且使各判定条件获得各种可能的取值。

局限性:测试不充分,未考虑单个判定对整体程序的影响,对程序执行逻辑的覆盖率较低

条件组合覆盖

条件组合覆盖是指选取足够的测试用例,使判定中条件的各种组合都至少被执行一次

局限性,测充分,某些情况可遗漏覆盖部分路径,且组合数量相对较大,往往花费较多的时间

路径覆盖

路径覆盖是相当强的一类覆盖标准,具体是指设计足够多的测试用例,使程序中所有可能的路径被执行一次

局限性:测试不充分,测试所需用用例数量相对较大,使工作量呈指数级增长

值得提醒的是,软件评测师考试中,逻辑覆盖相关知识点往往占据一定的分支,提醒多采用六种覆盖方式进行测试用例额的设计和依据各类覆盖的强弱关系进行语句判断

因此针对各类覆盖的强弱关系总结如下

  • 满足条件组合覆盖的测试用例一定满足语句覆盖、判定覆盖、条件覆盖和条件判定覆盖
  • 满足条件判定覆盖的测试用例一定满足语句覆盖、条件覆盖、判定覆盖
  • 满足判定覆盖的测试用例一定满足语句覆盖
  • 满足条件覆盖的测试用例不一定满足语句覆盖及判定覆盖

综上所述,各类覆盖均不是十全十美的,仅使用一种覆盖往往会导致测试片面,不充分,实际测试工作中通常会综合采用多种覆盖。例如,测试通过准则可能要求语句覆盖达到%,判定覆盖达到90%等

实验

针对源程序1采用六种逻辑覆盖方法设计测试用例

#include<stdio.h>
void main(){
    float A,B,X;
    scanf("%f %f %f",&A,&B,&X);
    if((A>1)&&(B==0))
        X=X/A;
    if((A==2)||(X>1))
        X=X+1;
    print("% f",X);
}

测试用例设计,绘制程序流程图,如所示

第二步,设计测试用例满足语句覆盖,如表所示

用例编号测试用例覆盖路径
1A=2,B=0,X=3ace

第三部,设计测试用例满足判定覆盖,如表3.2所示。其中,if((A>1)&&(B==0)),

if ((A==2)||(X>1))为源程序的两个判定。在此,考虑两个判定的每个分支被执行一次即可。

用例编号测试用例覆盖路径
1A=3,B=0,X=1A-C-D
2A=2,B=1,X=3A-B-E

第四步,设计测试用例满足条件覆盖。如表3.3所示,if((A>1)&&(B==0)),

if ((A==2)||(X>1))为源程序的两个判定。而

A>1 B==0 A==2 X>1

为两个判定的4个条件。在此,考虑

A>1 A<=1 B==0 B!=0 A==2  A!=2 X>1 X<=1

8种取值分别被执行一次即可

用例编号测试用例覆盖条件
1A=2,B=0,X=3A>1 B=0 A==2 X>1
2A=-1,B=2,X=1A<=1 B!=0 X<=1

第五步,设计测试用例满足条件判定覆盖,如表3.4所示。在此, 需要同时满足条件覆盖和判定覆盖

条件判定覆盖测试用例

用例编号测试用例覆盖路径覆盖条件
1a-c-ea>1 b=0 a=2 x>12,0,4
2a-b-da<=1 b!=0 a!=2 x<=11,2,0

第六步,设计测试用例满足条件组合覆盖。其中,if((A>1)&&(B==0)),

if ((A==2)||(X>1))为源程序的两个判定.在此,考虑((A>1)&&(b=0))

(A>1)&&(b!=0) (A<=1)&&(B=0) (A<=1)&&(B!=0) (A==2)||(x>1) (A=2)||(x<=1)

(A!=2)||(x>1) (A!=2)||(x<=1)八种组合情况均被执行一次即可

表条件组合覆盖测试用例

用例编号测试用例覆盖条件组合
1A=2,B=0,X=4A>1 B=0 A=2 X>1
22,3,1A>1 B!=0 A=2 x<=1
31,0,1a<=1 b=0 a!=2, x<=1
41,2,1a<=1 b!=0 a!=2 x<=1

注意:

条件组合仅仅针对同一个判定语句内存在多个条件的情况,在此情况下,讲这些条件的取值进行笛卡尔乘积组合即可。也就是说,对于不同的判定无需考虑条件组合,以及对但条件的判断语句仅需要满足自身所有取值即可

第七步,设计测试用例满足路径覆盖。再次,需满足程序中所有可能的路径被执行一次的要求

用例编号测试用例覆盖路径
1A=1,b=1,x=1a-b-d
21,1,2a-b-e
33,0,6a-c-d
42,0,4a-c-e

注意,实际设计出的覆盖路径及输入数据如果与上述设计不尽相同,则并非一定有误,例如在判定覆盖中,可选择a-c-e路径和a-b-d路径的组合也可以选择a-b-e和a-c-d的组合,均满足判定覆盖的要求。因此,本任务的操作步骤及用例仅仅用作参考

任务2:针对源程序2才用6种逻辑覆盖方法设计测试用例

int  testing(int x,int y){
	int software = 0;
	if((x>0) && (y>0))
		software = x+y+10;
	else
		software = x+y-10;
	if(software<0)
		software = 0
	return software;
}

第一步,绘制程序流程图,如3.2所示

第二步,设计测试用例满足语句覆盖,如表3.7所示

语句覆盖是用例

用例编号测试用例覆盖路径
11,1a-b-e-f
21,-1a-c-d-f

第三步,设计测试用例满足判定覆盖其中。if((x>0)&&(y>0)) if(software<0)为源程序的两个判定。再次,考虑两个判定的每个分支执行一次即可

判定覆盖测试用例

用例编号测试用例覆盖路径
11,1a-b-e-f
21,-1a-c-d-f

第四步,设计测试用例满足条件覆盖

如表3.9所示,if((x>0)&&(y>0)) if(software<0)为源程序的两个判定。而x>0,y>0和software为两个判定中的三个条件,因此,考虑 x>0 x<=0 y>0 y<=0 software<0 software >=0 6种取值均被执行一次

条件覆盖测试用例

用例编号测试用例覆盖路径
1x=3,y=3a-b-e-f
2x=-3,y=0a-c-d-f

第五步,设计测试用例满足条件判定覆盖,需要同时满足条件覆盖和判定覆盖

条件判定覆盖

用例编号测试用例覆盖路径
1x=3,y=3a-b-e-f
2x=-3,y=0a-c-d-f

第六步,设计测试用例满足条件组合覆盖(x>0)&&(y>0) (x>0)&&(y<=0) (x<0)&&(y>0) (x<=0)&&(y<=0)四种情况,以及software<0和 software>=0两种 取值均被执行一次即可

条件组合覆盖测试用例

用例编号测试用例覆盖路径
11,1a-b-e-f
2-1,0
-1,2

第七步,设计测试用例满足路径覆盖

用例编号测试用例覆盖路径
11,1a-b-e-f
-1,100acef
abdf
-1,-1acdf
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐