当前位置:网站首页>【白盒测试】逻辑覆盖和路径测试的设计方法
【白盒测试】逻辑覆盖和路径测试的设计方法
2022-07-16 12:14:00 【软件测试凡哥】
目录
前言
白盒测试主要是检查程序的内部结构、逻辑、循环和路径。白盒测试的常用用例设计方法有逻辑覆盖和基本路径测试。
根据覆盖测试的目标不同,逻辑覆盖又可分为语句覆盖、判断覆盖、条件覆盖、判断/条件覆盖、条件组合覆盖及路径覆盖。
1. 一个程序模块的例子

图1 一个程序模块的例图
从图中可知,该程序模块有4条不同的路径、4个可执行语句。这4条路径可分别表示为:
L1(a→c→e)简化为ace;
L2(a→b→d)简化为abd;
L3(a→b→e)简化为abe;
L4(a→c→d)简化为acd;
4条路径应该满足的逻辑表达式分别为:
记M={(A>1)and(B=0)},N={(A=2)or(X>1)}
L1(a→c→e)= M and N
L2(a→b→d)= /M and /N
L3(a→b→e)= /M and N
L4(a→c→d)= M and /N
其中,“/M”表示M的反,“/N”表示N的反,或者将4条路径应该满足的逻辑表达式写为:
L1(a→c→e)= {(A>1)and(B=0)} and {(A=2)or(X/A>1)} ;
L2(a→b→d)= / {(A>1)and(B=0)} and / {(A=2)or(X>1)} ;
L3(a→b→e)=/ {(A>1)and(B=0)} and {(A=2)or(X>1)} ;
L4(a→c→d)= {(A>1)and(B=0)} and / {(A=2)or(X/A>1)};
其中,由符号“and”连接起来的语句是为了遍历这条路径各个输入变量应取值的范围,而由“or”划分了几组可选的取值。根据上面导出的逻辑表达式,就可以用来设计测试用例。
2. 语句覆盖
语句覆盖就是设计若干个测试用例,运行所测程序,使得每一条可执行语句至少执行一次。对上面的例子,所有的可执行语句都在路径L1上,所以选择路径L1来设计测试用例,就要覆盖所有的可执行语句。
测试用例设计的格式如下:
[输入的(A,B,X),输出的(A,B,X)]为覆盖路径:L1(a→c→e)= M and N,{(A>1)and(B=0)} and {(A=2)or(X/A>1)}。可设计出满足语句覆盖的测试用例是:
[(2,0,4),(2,0,3)],覆盖ace[L1]。
从每个执行语句都得到执行这一点来看,语句覆盖的方法似乎能能够比较全面地检验每个可执行语句,但实际上并非如此。
语句覆盖的不足之处是:假如该程序段中的两个逻辑运算有问题,例如,第一个判断中的逻辑运算符“&&”写成了“||”,或者第二个判断中的逻辑运算符“||”错写成了“&&”,利用上面的测试用例,仍然可覆盖所有4个可执行语句,这说明虽然做到了语句覆盖测试,但可能发现不了判断时逻辑运算中出现的错误。语句覆盖是最弱的逻辑覆盖准则。
3. 判断覆盖
判断覆盖就是设计若干个测试用例,运行所测程序,使得程序中每个判断的取TRUE分支和取FALSE分支至少经历一次。判断覆盖又称为分支覆盖。
根据定义,可分别选择路径L1和L2或者路径L3和L4设计测试用例。
如果选择路径L1和L2,则可得到满足要求的测试用例:
[(2,0,4),(2,0,3)],覆盖ace[L1]
[(1,1,1),(1,2,1)],覆盖abd[L2]
如果选择路径L3和L4,则可设计另一组测试用例:
[(2,1,1),(2,1,2)],覆盖abe[L3]
[(3,0,3),(3,0,1)],覆盖acd[L4]
可见,测试用例的选择不唯一。
判断覆盖的不足之处是:假如第二个判断中的条件X>1被错写成了X<1,利用上面的两组测试用例仍能得到同样的结果。
4. 条件覆盖
条件覆盖就是设计若干个测试用例,运行所测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。因此,首先要对所有的条件加以标记。
对第一个判断:
- 条件A>1取TRUE时为T1,取FALSE时为F1;
- 条件B=0取TRUE时为T2,取FALSE时为F2;
对第二个判断:
- 条件A=2取TRUE时为T3,取FALSE时为F3;
- 条件X>1取TRUE时为T4,取FALSE时为F4。
根据这8个条件取值,可分别设计如下两组测试用例,如表1和表2所列。
表1 第一组
测试用例 | 通过路径 | 条件取值 | 覆盖分支 |
[(1,0,3),(1,0,4)] | abe(L3) | F1,T2,F3,T4 | b,e |
[(2,1,1),(2,1,2)] | abe(L3) | T1,F2,T3,F4 | b,e |
表2 第二组
测试用例 | 通过路径 | 条件取值 | 覆盖分支 |
[(2,0,4),(2,0,3)] | ace(L1) | T1,T2,T3,T4 | c,e |
[(1,0,1),(1,0,1)] | abd(L2) | F1,T2,F3,F4 | b,d |
[(2,1,1),(2,1,2)] | abe(L3) | T1,F2,T3,,F4 | b,e |
由表1和表2可以看出,两组测试用例都满足了条件覆盖,即覆盖了所有的体哦阿健取值。条件覆盖的不足之处是:第一组测试用例不满足判断(分支)覆盖的要求。
5. 判断-条件覆盖
判断-条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断的所有可能判断结果至少执行一次。也就是说,要求各个判断的所有可能的条件取值组合至少执行一次。
根据判断-条件覆盖的定义,只需设计下面两个测试用例来覆盖例子的8个条件取值以及4个判断分支,如表3所列。
表3 判断分支列表
测试用例 | 通过路径 | 条件取值 | 覆盖分支 |
[(2,0,4),(2,0,3)] | ace(L1) | T1,T2,T3,T4 | c,e |
[(2,1,1),(2,1,2)] | abd(L2) | F1,F2,F3,F4 | b,d |
判断-条件覆盖的不足之处是:从表面上看来,判断-条件覆盖测试了所有条件的取值,但实际上并非如此,而是某些条件掩盖了另一些条件(由于多重条件判定),例如,对条件表达式(A>1)AND(B=0)来说,若(A>1)的测试结果为FALSE,可以立即确定表达式的结果为FALSE,这时往往就不再测试(B=0)的取值了,因此,条件(B=0)就没有被检查。同样,对条件表达式(A=2)OR(X>1)来说,若(A=2)的测试结果为TRUE,就立即确定表达式的结果为TRUE,这时,条件(X>1)就没有被检查。
因此,采用判断-条件覆盖测试,逻辑表达式中的错误不一定能够检查的出来。
6. 条件组合覆盖
条件组合覆盖就是设计足够的测试用例,运行所测程序,使得每个判断的所有可能的条件取值组合至少执行一次。
针对上面的例子,先对各个判断的条件取值组合加以标记,如表4所列。
表4 判断条件取值组合表
组合编号 | 条件取值的组合 | 标记 | 说明 |
① | A>1,B=0 | T1,T2 | 属第一个判断的取TRUE分支 |
② | A>1,B!=0 | T1,F2 | 属第一个判断的取FLASE分支 |
③ | A<=1,B=0 | F1,T2 | 属第一个判断的取FLASE分支 |
④ | A<=1,B!=0 | F1,F2 | 属第一个判断的取FLASE分支 |
⑤ | A=2,X>1 | T3,T4 | 属第二个判断的取TRUE分支 |
⑥ | A=2,X<=1 | T3,F4 | 属第二个判断的取TRUE分支 |
⑦ | A!=2,X>A | F3,T4 | 属第二个判断的取TRUE分支 |
⑧ | A!=2,X<=1 | F3,F4 | 属第二个判断的取FLASE分支 |
对每个判断,要求所有可能的条件取值的组合都必须取到。每个判断各有两个条件,所以各有4个条件取值的组合。
注意:这里没有要求第一个判断的4个组合再与第二个判断的4个组合进行组合成16个组合。
设计4个测试用例,就可覆盖上面的8种条件组合,如表5所列。
表5 4个测试取值组合列表
测试用例 | 通过路径 | 覆盖条件 | 覆盖组合号 |
[(2,0,4),(2,0,3)] | ace(L1) | T1,T2,T3,T4 | ①⑤ |
[(2,1,1),(2,1,2)] | abe(L3) | T1,F2,T3,F4 | ②⑥ |
[(1,0,3),(1,0,4)] | abe(L3) | F1,T2,F3,T4 | ③⑦ |
[(1,1,1),(1,1,1)] | abd(L2) | F1,F2,F3,F4 | ④⑧ |
这些测试用例覆盖了所有条件的可能取值的组合,覆盖了所有判断的可取分支。条件组合覆盖的不足之处:没有覆盖路径L4,这样的测试还不完全。
7. 路径覆盖
路径覆盖就是设计足够的测试用例,覆盖程序中所有可能的路径。可设计下面的4个测试用例,覆盖全部4条路径。表6所列是对应实例程序的路径覆盖测试用例。
表6 设计4个测试用例覆盖全部4条路径
测试用例 | 通过路径 | 覆盖条件 | 覆盖组合号 |
[(2,0,4),(2,0,3)] | ace(L1) | T1,T2,T3,T4 | ①⑤ |
[(1,1,1),(1,1,1)] | abd(L2) | F1,F2,F3,F4 | ④⑧ |
[(1,1,2),(1,1,3)] | abe(L3) | F1,F2,F3,T4 | ④⑦ |
[(3,0,3),(3,0,1)] | acd(L4) | T1,T2,F3,F4 | ①⑧ |
路径覆盖的不足之处,没有全部覆盖判断的条件取值的组合,如②③⑥。
8. 测试用例的组合和优化
对该例子,采用逻辑覆盖方法中的任何一种都不能满足所有需求,如果每个方法都采用,又有测试用例的重复。如何用最少的测试用例满足最多的需求呢?在设计中,这是一个值得考虑和解决的问题。
对于本例,我们采用条件组合覆盖和路径覆盖两种方法设计测试用例,并进行优化,可得到如表7所列的测试用例。
表7 采用条件组合覆盖和路径覆盖设计测试用例表
测试用例 | 通过路径 | 覆盖条件 | 覆盖组合号 |
[(2,0,4),(2,0,3)] | ace(L1) | T1,T2,T3,T4 | ①⑤ |
[(1,1,1),(1,1,1)] | abd(L2) | F1,F2,F3,F4 | ④⑧ |
[(1,1,2),(1,1,3)] | abe(L3) | F1,F2,F3,T4 | ④⑦ |
[(3,0,3),(3,0,1)] | acd(L4) | T1,T2,F3,F4 | ①⑧ |
[(2,0,4),(2,0,3)] | ace(L1) | T1,T2,T3,T4 | ①⑤ |
[(2,1,1),(2,1,2)] | abe(L3) | T1,F2,T3,F4 | ②⑥ |
[(1,0,3),(1,0,4)] | abe(L3) | F1,T2,F3,T4 | ③⑦ |
[(1,1,1),(1,1,1)] | abd(L2) | F1,F2,F3,F4 | ④⑧ |
采用上面的8个测试用例,可满足所有逻辑覆盖测试。
结语
这篇帖子到这里就结束了,最后,希望看这篇帖子的朋友能够有所收获。如果想以测试为长期发展职业目标,是需要时刻保持学习的,要使自己具备竞争力,无论你现在工作几年,只要行动起来,你就已经占优势了。祝大家2022年能升职加薪,没入职的就早日拿到心仪公司的offer,事事顺遂。
欢迎留言,或是关注我的专栏和我交流。
边栏推荐
- Principle and application of vulnerability scanning
- How to solve the problem of 8080 port being occupied
- 美国压力激增 TikTok更换全球安全主管
- 漏洞扫描的原理与应用
- balanced binary tree
- Swd/jtag communication failure and no target connected
- 数据湖(十一):Iceberg表数据组织与查询
- Find prime number
- [paper reading] deep transformer q-networks for partially observable reinforcement learning
- MFC|框架下按钮的自绘
猜你喜欢
随机推荐
[trample pit collection] 7.14
JS Base64 to picture
Postgresql源码(10)Xlog组装
About the problem that the valueint of cjson exceeds the integer range
离婚后,子女大额抚养费双方如何负担
[paper reading] deep transformer q-networks for partially observable reinforcement learning
机械臂速成小指南(零点五):机械臂相关资源
flutter实现hero图片渐变放大 圖片等比方法圖片平滑放大
V831 - use of IO port
五 其它目标和通用选项的介绍
From physics to AI and war database, the career choice of post-95 programmers
一周精彩内容分享(第12期)重复
Scope and constructor details
Stc8h development (XIV): I2C drive rx8025t high-precision real-time clock chip
Alipay sandbox tests mobile website payment, prompting that the merchant's cooperation agreement has expired and cannot continue to be used
如何解决8080端口被占用
ipfs记录
【踩坑合辑】7.14
Introduction to leetcode special dynamic planning
27-Scala入门、基本数据类型和方法与函数的介绍









