白盒测试技术案例详解.docx
- 文档编号:3814036
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:52
- 大小:886.16KB
白盒测试技术案例详解.docx
《白盒测试技术案例详解.docx》由会员分享,可在线阅读,更多相关《白盒测试技术案例详解.docx(52页珍藏版)》请在冰豆网上搜索。
白盒测试技术案例详解
白盒测试技术案例详解
白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。
其中运用最为广泛的是基本路径测试法。
基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。
设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次。
在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例。
包括以下4个步骤和一个工具方法:
1.程序的控制流图:
描述程序控制流的一种图示方法。
2.程序圈复杂度:
McCabe复杂性度量。
从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。
3.导出测试用例:
根据圈复杂度和程序结构设计用例数据输入和预期结果。
4.准备测试用例:
确保基本路径集中的每一条路径的执行。
工具方法:
图形矩阵:
是在基本路径测试中起辅助作用的软件工具,利用它可以实现自动地确定一个基本路径集。
程序的控制流图:
描述程序控制流的一种图示方法。
圆圈称为控制流图的一个结点,表示一个或多个无分支的语句或源程序语句
流图只有二种图形符号:
图中的每一个圆称为流图的结点,代表一条或多条语句。
流图中的箭头称为边或连接,代表控制流
任何过程设计都要被翻译成控制流图。
如何根据程序流程图画出控制流程图?
在将程序流程图简化成控制流图时,应注意:
n在选择或多分支结构中,分支的汇聚处应有一个汇聚结点。
n边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。
如下图所示
n如果判断中的条件表达式是由一个或多个逻辑运算符(OR,AND,NAND,NOR)连接的复合条件表达式,则需要改为一系列只有单条件的嵌套的判断。
例如:
1ifaorb
2x
3else
4y
对应的逻辑为:
独立路径:
至少沿一条新的边移动的路径
基本路径测试法的步骤:
o第一步:
画出控制流图
流程图用来描述程序控制结构。
可将流程图映射到一个相应的流图(假设流程图的菱形决定框中不包含复合条件)。
在流图中,每一个圆,称为流图的结点,代表一个或多个语句。
一个处理方框序列和一个菱形决测框可被映射为一个结点,流图中的箭头,称为边或连接,代表控制流,类似于流程图中的箭头。
一条边必须终止于一个结点,即使该结点并不代表任何语句(例如:
if-else-then结构)。
由边和结点限定的范围称为区域。
计算区域时应包括图外部的范围。
画出其程序流程图和对应的控制流图如下
第二步:
计算圈复杂度
圈复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目,为确保所有语句至少执行一次的测试数量的上界。
独立路径必须包含一条在定义之前不曾用到的边。
有以下三种方法计算圈复杂度:
流图中区域的数量对应于环型的复杂性;
给定流图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中结点的数量;
给定流图G的圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定结点的数量。
第三步:
导出测试用例
根据上面的计算方法,可得出四个独立的路径。
(一条独立路径是指,和其他的独立路径相比,至少引入一个新处理语句或一个新判断的程序通路。
V(G)值正好等于该程序的独立路径的条数。
)
ü路径1:
4-14
ü路径2:
4-6-7-14
ü路径3:
4-6-8-10-13-4-14
ü路径4:
4-6-8-11-13-4-14
根据上面的独立路径,去设计输入数据,使程序分别执行到上面四条路径。
o第四步:
准备测试用例
为了确保基本路径集中的每一条路径的执行,根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测试到,满足上面例子基本路径集的测试用例是:
举例说明:
例:
下例程序流程图描述了最多输入50个值(以–1作为输入结束标志),计算其中有效的学生分数的个数、总分数和平均值。
步骤1:
导出过程的流图。
步骤2:
确定环形复杂性度量V(G):
1)V(G)=6(个区域)
2)V(G)=E–N+2=16–12+2=6
其中E为流图中的边数,N为结点数;
3)V(G)=P+1=5+1=6
其中P为谓词结点的个数。
在流图中,结点2、3、5、6、9是谓词结点。
步骤3:
确定基本路径集合(即独立路径集合)。
于是可确定6条独立的路径:
路径1:
1-2-9-10-12
路径2:
1-2-9-11-12
路径3:
1-2-3-9-10-12
路径4:
1-2-3-4-5-8-2…
路径5:
1-2-3-4-5-6-8-2…
路径6:
1-2-3-4-5-6-7-8-2…
步骤4:
为每一条独立路径各设计一组测试用例,以便强迫程序沿着该路径至少执行一次。
1)路径1(1-2-9-10-12)的测试用例:
score[k]=有效分数值,当k
score[i]=–1,2≤i≤50;
期望结果:
根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。
2)路径2(1-2-9-11-12)的测试用例:
score[1]=–1;
期望的结果:
average=–1,其他量保持初值。
3)路径3(1-2-3-9-10-12)的测试用例:
输入多于50个有效分数,即试图处理51个分数,要求前51个为有效分数;
期望结果:
n1=50、且算出正确的总分和平均分。
4)路径4(1-2-3-4-5-8-2…)的测试用例:
score[i]=有效分数,当i<50;
score[k]<0,k
期望结果:
根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。
举例说明:
例:
下例程序流程图描述了最多输入50个值(以–1作为输入结束标志),计算其中有效的学生分数的个数、总分数和平均值。
步骤1:
导出过程的流图。
步骤2:
确定环形复杂性度量V(G):
1)V(G)=6(个区域)
2)V(G)=E–N+2=16–12+2=6
其中E为流图中的边数,N为结点数;
3)V(G)=P+1=5+1=6
其中P为谓词结点的个数。
在流图中,结点2、3、5、6、9是谓词结点。
步骤3:
确定基本路径集合(即独立路径集合)。
于是可确定6条独立的路径:
路径1:
1-2-9-10-12
路径2:
1-2-9-11-12
路径3:
1-2-3-9-10-12
路径4:
1-2-3-4-5-8-2…
路径5:
1-2-3-4-5-6-8-2…
路径6:
1-2-3-4-5-6-7-8-2…
步骤4:
为每一条独立路径各设计一组测试用例,以便强迫程序沿着该路径至少执行一次。
1)路径1(1-2-9-10-12)的测试用例:
score[k]=有效分数值,当k
score[i]=–1,2≤i≤50;
期望结果:
根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。
2)路径2(1-2-9-11-12)的测试用例:
score[1]=–1;
期望的结果:
average=–1,其他量保持初值。
3)路径3(1-2-3-9-10-12)的测试用例:
输入多于50个有效分数,即试图处理51个分数,要求前51个为有效分数;
期望结果:
n1=50、且算出正确的总分和平均分。
4)路径4(1-2-3-4-5-8-2…)的测试用例:
score[i]=有效分数,当i<50;
score[k]<0,k
期望结果:
根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。
连接权为“1”表示存在一个连接,在图中如果一行有两个或更多的元素“1”,则这行所代表的结点一定是一个判定结点,通过连接矩阵中有两个以上(包括两个)元素为“1”的个数,就可以得到确定该图圈复杂度的另一种算法。
案例讲解:
基本路径测试……如下程序:
1.voidReadPara(CStringtemp)
2.{
3. if(temp==">=")
4. m_oper.SetCurSel(0);
5. else
6. {
7. if(temp==">")
8. m_oper.SetCurSel
(1);
9. else
10. {
11. if(temp=="==")
12. m_oper.SetCurSel
(2);
13. else
14. {
15.if(temp=="<=")
16.m_oper.SetCurSel(3);
17. else
18. {
19. if(temp=="<")
20. m_oper.SetCurSel(4);
21. else
22. m_oper.SetCurSel(5);
23. }
24. }
25. }
26.
}
27.return;
28.}
1.画出这段代码的控制流图,如4-9所示:
2.根据控制流图,计算环路复杂度V(G)=22-18+2=6。
3.导出测试用例,列出路径:
Path1:
2-3-4-27-28
Path2:
2-3-7-8-26-27-28
Path3:
2-3-7-11-12-25-26-27-28
Path4:
2-3-7-11-15-16-24-25-26-27-28
Path5:
2-3-7-11-15-19-20-23-24-25-26-27-28
Path6:
2-3-7-11-15-19-22-23-24-25-26-27-28
4.设计测试用例
根据第3步中给出的路径,下面设计测试用例列在表4-9中。
传入参数
预期调用
Path1
ReadPara(”>=”)
m_oper.SetCurSel(0)
Path2
ReadPara(”>”)
m_oper.SetCurSel
(1)
Path3
ReadPara(”==”)
m_oper.SetCurSel
(2)
Path4
ReadPara(”<”)
m_oper.SetCurSel(3)
Path5
ReadPara(”<=”)
m_oper.SetCurSel(4)
Path6
ReadPara(”+”)
m_oper.SetCurSel(5)
5.图形矩阵的画法在前面我们已经讲过,这里不再赘述。
(请同学们自行画出)
九、最少测试用例数计算(参考)
⏹为实现测试的逻辑覆盖,必须设计足够多的测试用例,并使用这些测试用例执行被测程序,实施测试。
我们关心的是:
对于某个具体的程序来说,至少需要设计多少个测试用例。
这里提供一种估算最少测试用例数的方法。
⏹我们知道,结构化程序是由3种基本控制结构组成:
顺序型(构成串行操作)、选择型(构成分支操作)和重复型(构成循环操作)。
⏹为了把问题化简,避免出现测试用例极多的组合爆炸,把构成循环操作的重复型结构用选择结构代替。
这样,任一循环便改造成进入循环体或不进入循环体的分支操作了。
★用N-S图表示程序的3种基本控制结构:
Ø图中A、B、C、D、S均表示要执行的操作,P是可取真假值的谓词,Y表真值,N表假值。
Ø图中的(c)和(d)两种重复型结构代表了两种循环。
在做了简化循环的假设以后,对于一般的程序控制流,我们只考虑选择型结构。
事实上它已经能体现顺序型和重复型结构了。
⏹例如,下图表达了两个顺序执行的分支结构。
当两个分支谓词P1和P2取不同值时,将分别执行a或b及c或d操作。
显然,要测试这个小程序,需要至少提供4个测试用例才能作到逻辑覆盖,使得ac、ad、bc及bd操作均得到检验。
其实,这里的4是图中的第1个分支谓词引出的两个操作,及第2个分支谓词引出的两个操作组合起来而得到的,即2×2=4。
并且,这里的2是由于两个并列的操作,即1+1=2而得到的。
⏹对于一般的、更为复杂的问题,估算最少测试用例个数的原则也是同样的:
Ø如果在N-S图中存在有并列的层次A1、A2,A1和A2的最少测试用例个数分别为a1、a2,则由A1、A2两层所组合的N-S图对应的最少测试用例数为a1×a2。
Ø如果在N-S图中不存在有并列的层次,则对应的最少测试用例数由并列的操作数决定,即N-S图中除谓词之外的操作框的个数。
Ø例:
如下图所示的两个N-S图,至少需要多少个测试用例完成逻辑覆盖?
Ø
对于第一个N-S图:
由于图中并不存在并列的层次,最少测试用例数由并列的操作数决定,即为1+1+1=3。
Ø对于第二个N-S图:
由于图中没有包含并列的层次,最少测试用例数仍由并列的操作数决定,即为1+1+1+1+1=5。
★例:
如下图所示的N-S图,至少需要多少个测试用例完成逻辑覆盖?
Ø
分析该N-S图:
图中的2345和67是并列的两层。
其中,2345层对应的最少测试用例数为1+1+1+1+1=5,67层对应的测试用例数为1+1+1=3,2345和67这两层组合后对应的测试用例数为5×3=15。
最后,由于两层组合后的部分是不满足谓词1时所要做的操作,还要加上满足谓词1要做的操作,因此整个程序所需测试用例数为15+1=16。
思考题:
1、将下图所示的流程图转换为N-S图,并估算至少需要多少个测试用例完成逻辑覆盖?
2、某程序所画出的N-S图
如右图所示的,至少需要
多少个测试用例才能对该
程序实现逻辑覆盖?
白盒测试简单归纳
1、白盒测试基本技术
词法分析与语法分析、静态错误分析、表达式分析、接口分析
白盒测试又称为逻辑驱动测试,根据软件概要设计和详细设计说明文档生成用于白盒测试的测试用例。
2、程序插桩技术
程序插桩方法:
是借助往被测程序中插入操作,来实现测试目的的方法。
插桩时需要考虑哪些问题:
1)、探测哪些信息
2)、在程序的什么部位设置探测点
3)、需要设置多少个探测点
3、代码检查方式
桌面检查、代码审查、走查
4、静态结构分析
由于可能没有在所有的出口进行动态内存的释放与回收操作,困些这样的结构存在内存泄漏的可能。
5、逻辑覆盖法
白盒测试的动态测试要根据程序的控制结构设计测试用例,原则是
1)、保证一个模块中的所有独立路径至少被使用一次
2)、对所有逻辑值均需测试true和false
3)、在上下边界及可操作范围内运行所有循环
4)、检查内部数据结构以确保其有效性。
6、逻辑覆盖的标准:
●Foster的ESTCA覆盖标准
●Woodward等人的层次LCSAJ覆盖标准
⏹基于LCSAJ与路径的关系,提出了层次LCSAJ覆盖准则。
它是一个分层的覆盖准则,可以概括的描述为:
Ø第一层—语句覆盖。
Ø第二层—分支覆盖。
Ø第三层—LCSAJ覆盖,即程序中的每一个LCSAJ都至少在测试中经历过一次。
Ø第四层—两两LCSAJ覆盖,即程序中的每两个相连的LCSAJ组合起来在测试中都要经历一次。
Ø第n+2层—每n个首尾相连的LCSAJ组合在测试中都要经历一次。
⏹在实施测试时,若要实现上述的层次LCSAJ覆盖,需要产生被测程序的所有LCSAJ。
⏹例:
找出下面DoWork函数的所有LCSAJ和LCSAJ路径。
voidDoWork(intx,inty,intz)
1.{
2.intk=0,j=0;
3.if((x>3)&&(z<10))
4.{k=x*y-1;
5.j=sqrt(k);
6.}//语句块1
7.if((x==4)||(y>5))
8.{j=x*y+10;}//语句块2
9.j=j%3;//语句块3
10.}
ØLCSAJ(5个):
(1)intk=0,j=0;if((x>3)&&(z<10))
(2)k=x*y-1;j=sqrt(k);if((x==4)||(y>5))
(3)if((x==4)||(y>5))
(4)j=x*y+10;j=j%3
(5)j=j%3
ØLCSAJ路径(4条):
(1)-
(2)-(4)
(1)-
(2)-(5)
(1)-(3)-(4)
(1)-(3)-(5)
7、为什么要进行白盒测试?
原因有三,如下:
●逻辑错误和不正确假设与一条程序路径被运行的可能性成反比。
●我们经常相信某逻辑路径不可能被执行,而事实上,它可能在正常的基础上被执行。
●印刷上的错误是随机的。
8、白盒测试用例测试方法
1、语句(statement)覆盖:
语句覆盖是最起码的结构覆盖要求,要求设计足够多的测试用例,使得程序中每条可执行语句至少被执行一次。
2、判定(branches)覆盖/分支覆盖:
要求设计足够多的测试用例,使得程序中每个判定至少有一次为真值,有一次为假值,即:
程序中的每个分支至少执行一次。
3、条件(condition)覆盖:
要求设计足够多的测试用例,使得判定中的每个条件至少有一次为真值,有一次为假值。
4、判定/条件(branches/condition)覆盖:
设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身所有可能结果也至少出现一次。
5、组合覆盖:
要求设计足够多的测试用例,使得每个判定中条件结果的所有可能组合至少出现一次。
6、路径覆盖:
设计足够的测试用例,覆盖程序中所有可能的路径
下面举例说明:
语句覆盖(SC):
程序中的每条词句至少执行一次
如●针对以下程序段,对于变量c的取值,至少需要(61)个测试用例才能够满足语句覆盖的要求。
c=((u8_t*)q->payload)[i];
switch(c)
{
caseSLIP_END:
sio_send(SLIP_ESC,netif->state);
sio_send(SLIP_ESC_END,netif->state);
break;
caseSLIP_ESC:
sio_send(SLIP_ESC,netif->state);
sio_send(SLIP_ESC_ESC,netif->state);
break;
default:
sio_send(c,netif->state);
break;
}
(61)A.4 B.3 C.2 D.1
判定覆盖(DC)
设计足够测试用例,使得程序中的每个判定至少都获得一次“真值”或“假值”,或都说使得程序中的每一个取“真”或“假”分支至少经历一次,因些判定覆盖又称分支覆盖。
A&&(B||C),A||(B||C)
A=T,B=T,C=T
A=F,B=F,C=F
●针对以下C语言程序段,对于(MaxNum,Type)的取值,至少需要(62)个测试用例能够满足判定覆盖的要求。
while(MaxNum-->0)
{
if(10==Type)
x=y*2;
else
if(100==Type)
x=y+10;
else
x=y-20;
}
(62)A.5 B.4 C.3 D.2
测试用例:
(1,10),(1,100),(1,200)
条件覆盖(CC):
构造一组测试用例,使得每一判定语句中每个逻辑条件的可能值至少满足一次
A&&(B||C),A||(B||C)
A=T,B=F,C=T
A=F,B=T,C=F
●针对下列程序段,对于(A,B)的取值,以下(57)测试用例组合能够满足条件覆盖的要求。
IF((A-10)=20AND(B+20)>10)THENC=0
IF((A-30)<10AND(B-30)<0)THENB=30
①A=50B=-10②A=40B=40③A=30B=-10④A=30B=30
(57)A.①② B.③④ C.①④ D.②④
A
B
A-10=20
B+20>10
A-30<10
B-30<0
1
50
-10
F
F
F
T
2
40
40
F
T
F
F
3
30
-10
T
T
T
T
4
30
30
T
T
T
F
条件判定组合覆盖(CDC)
设计足够的测试用例,使得判定中每个条件的所有可能(真/假)至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次。
A&&(B||C),A||(B||C)
A=T,B=T,C=T
A=F,B=F,C=F
多条件覆盖(MCC)
使得每个判定中条件的各种可能组合都至少出现一次。
A&&(B||C),A||(B||C)
A------B--------C
T------T--------T
T-----T-------F
T------F--------T
T------F--------F
F------F--------F
F------F--------T
F------T--------F
F------T--------T
(2006)●多条件覆盖是一种逻辑覆盖,它的含义是设计足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次,满足多条件覆盖级别的测试用例也是满足___(26)___级别的:
针对布尔表达式A&&(B||C)执行逻辑覆盖测试,测试用例至少需要___(27)___种组合才能满足多条件覆盖的要求。
(26)A.语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖
B.判定覆盖、条件覆盖;条件判定组合覆盖、修正条件判定覆盖
C.语句覆盖、判定覆盖、条件判定组合覆盖、修正条件判定覆盖
D.路径覆盖、判定覆
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 测试 技术 案例 详解
![提示](https://static.bdocx.com/images/bang_tan.gif)