白盒测试用例的操持(图文讲授)

[复制链接]
发表于 2025-10-9 22:30:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快  
正文


  • 语句覆盖:每条语句至少实验一次。
  • 判断覆盖:每个判断的全部大概结果至少出现一次。(又称“分支覆盖”)
  • 条件覆盖:每个条件的全部大概结果至少实验一次。
  • 判断/条件覆盖:一个判断中的每个条件的全部大概结果至少实验一次,而且每个判断自己的全部大概结果至少实验一次。
  • 多重条件覆盖(组合覆盖):每个判断中的全部大概的条件结果的组合,以及全部的入口点都至少实验一次。(注意“大概”二字,由于有些组合的环境难以天生。)
  • 完全路径覆盖:每条路径至少实验一次。
  • 根本路径覆盖:根据流图盘算环复杂度,得到根本路径覆盖的用例数。
  • 分割后的完全路径覆盖:每条路径至少实验一次,每个条件的全部大概结果至少实验一次。
覆盖水平
路径覆盖 > 多重条件覆盖 > 判断/条件覆盖 > 条件覆盖 > 判断覆盖 > 语句覆盖
1. 路径覆盖是覆盖率最高的。语句覆盖最弱。
2. 满足多重条件覆盖准则的测试用例集,同样满足判断覆盖准则、条件覆盖准则和判断/条件覆盖准则。
任何一种覆盖方法都无法实现完全的测试。以是,在实际的测试用例操持过程中,根据必要将差别的覆盖方法组合起来使用,以实现最佳的测试用例操持 。
  1. public void foo (int a, int b, int x) {
  2.     if(a>1 && b ==0) {
  3.         x = x/a;
  4.     }
  5.     if (a==2 || x>1) {
  6.         x = x+1;
  7.     }
  8. }
复制代码
一、语句覆盖



使用此准则测试上述小步伐,只必要遍历路径ace,便将步伐中的全部语句便都实验了一次。天生的用例及其遍历路径如下:

  • A=2,B=0,X=4 ace
缺点:语句覆盖是“最弱的覆盖”,它难以发现步伐中的错误。①步伐中存在一条x的值未发生改变的路径abd没有测试。②它无法发现判断的错误,好比第一个判断条件大概应该是“或”,而不是“与”。③无法发现条件的错误,好比第二个判断中的条件X>1,大概究竟上应该是X>0。
二、判断覆盖


使用此准则测试小步伐,只必要涵盖路径ace和abd,或涵盖路径acd和abe,就可以使得两个判断为“真”和为“假”的分支都实验一次。如果选择后一种环境,天生的用例及其遍历的路径如下:

  • A=3,B=0,X=3 acd
  • A=2,B=1,X=1 abe
我们仅有50%的大概性遍历到X值未发生改变的路径,即,只有我们选择涵盖路径ace和abd的环境,而不是涵盖路径acd和abe时。对应的测试用比方下:

  • A=2,B=0,X=2 ace
  • A=3,B=1,X=1 abd
缺点:这两组测试用例都存在同一个题目:当判断由多个条件组合构成时,它未必能发现每个条件的错误。如果第二个判断把条件X>1错误的写成了X<1,我们操持的测试用例仍旧无法找出这个错误。
三、条件覆盖


第一个判断的全部条件的大概取值环境是A>1或A≤1,B=0或B≠0。第二个判断的全部条件大概的取值环境为A=2或A≠2,X>1或X≤1。天生的用例及其遍历的路径如下所示:

  • A=1,B=0,X=3 abe
  • A=2,B=1,X=1 abe
缺点:条件覆盖并不肯定总能覆盖全部分支。测试用例固然满足了条件覆盖准则,但是只涵盖了步伐的路径abe。但是,条件覆盖还是要比判断覆盖强一些,由于条件覆盖大概会使判断中各个条件的结果都取“真”或着取“假”,而判断覆盖却做不到这一点。
四、判断/条件覆盖


判断/条件覆盖,既要思量到单个判断中每个条件的大概环境(A>1或A≤1,B=0或B≠0,A=2或A≠2,X>1或X≤1),也要思量到每个判断的大概环境(路径ace和abd,或路径acd和abe)。用例及其遍历的路径如下所示:

  • A=2,B=0,X=4 ace
  • A=1,B=1,X=1 abd
缺点:条件覆盖和判断/条件覆盖不肯定会发现逻辑表达式中的错误。只管看上去全部条件的全部结果好像都实验到了,但由于有些条件会屏蔽掉反面的条件,并不肯定能全部实验得到。比方,上述测试用例①满足了条件A=2后,就不再实验对条件X>1的判断;测试用例②中不满足条件A>1后,就不再实验对条件B=0的判断。
五、多重条件覆盖


满足多重条件覆盖准则的测试用例,必须覆盖以下8种组合:

天生的测试用例,以及它们遍历的路径和覆盖的组合如下:

  • A=2,B=0,X=4 ace 覆盖组合1,5
  • A=2,B=1,X=1 abe 覆盖组合2,6
  • A=1,B=0,X=2 abe 覆盖组合3,7
  • A=1,B=1,X=1 abd 覆盖组合4,8
缺点:多重条件覆盖不肯定能覆盖到每条路径,路径acd就被遗遗漏了。
六、路径覆盖

为了满足路径覆盖,必须起首确定详细的路径以及独立路径的个数。画出流程图。

方法一:我们通常接纳控制流图的边(弧)序列和节点序列表现某一条详细路径。
(1)弧a和弧b相乘,表现为ab,它表明路径是先履历弧a,接着再履历弧b。
(2)弧a和弧b相加,表现为a+b,它表明两条弧是“或”的关系,是并行的路段。
在路径表达式中,将全部弧均以数值1来取代,再举行表达式的相乘和相加运算,末了得到的数值即为该步伐的 独立路径数 = (1+1*1)*(1+1*1)= 2*2 = 4。
方法二:与弧的盘算方式类似,还可以通过必经节点个数 i,再找出必经节点下的路径数 w(i) ,盘算路径数。流程图中共有2个必经节点②⑥,且先履历②再履历⑥,没有并行的独立节点,独立路径数 = w(1)*...*w(i) = 2*2 = 4。
两种方法盘算得到的路径数均为4条,它们分别覆盖了abd、abe、acd、ace:

  • A=1,B=0,X=1 abd
  • A=1,B=0,X=2 abe
  • A=3,B=0,X=1 acd
  • A=2,B=0,X=3 ace
缺点:
(1)路径覆盖无法发现步伐不符合操持规范的错误(必要借助于黑盒测试的外部规格分析书)。好比,① 不肯定发现路径自己的错误(缺一条或多一条路径);② 大概不会袒露数据敏感的错误(好比盘算两数之差小于某个值,如果步伐实现的是a-b<c,而不是|a-b|<c,那么当b-a>c时则无法发现步伐的逻辑错误。)。以是,发起先使用黑盒方法操持测试用例,再使用白盒方法对用例举行增补。
(2)路径覆盖不肯定把全部的条件组合环境都覆盖。以上测试用例只管从外貌上看已经满足路径覆盖,但是却无法发现步伐当条件语句中的B=0误写为B>=0时的错误,即没有对B≠0的环境举行测试。别的,第4个用例中由于A=2,第二个判断中的X>1条件被忽略,固然覆盖了路径abd,却无法发现X>1误写为X>2时的错误,即没有对覆盖ace路径时X>1的环境举行测试。
(3)复杂步伐的用例数呈指数级上升。假设一段步伐有10条判断语句,则i=10, w(i)=2,独立路径数为2的10次方,即1024,则要为它操持1024个测试用例。
七、完全路径覆盖

完全路径即全部独立路径的聚集;非完全路径,即全部独立路径聚集的真子集。前面列出的独立路径集归并非完全路径,由于前面的流程图中含有隐含路径。
因此,如果判断中的条件表达式是由一个或多个逻辑运算符 (OR, AND, NAND, NOR)毗连的复合条件表达式,则必要改为一系列只有单条件的嵌套的判断。细化后不含隐含路径的控制流图和流程图见下。

独立路径数 = (1+1*1+1*1)*(1*1+1*1*1+1*1) = 3*3 = 9。
大概,必经节点有两个(节点2.1和节点6.1),独立路径数 = w(1)*w(2) = 3*3 = 9。

  • 路径一:2.1→6.1→6.2→8
  • 路径二:2.1→6.1→6.2→7→8
  • 路径三:2.1→6.1→7→8
  • 路径四:2.1→2.2→6.1→6.2→8
  • 路径五:2.1→2.2→6.1→6.2→7→8
  • 路径六:2.1→2.2→6.1→7→8
  • 路径七:2.1→2.2→3→6.1→6.2→8
  • 路径八:2.1→2.2→3→6.1→6.2→7→8
  • 路径九:2.1→2.2→3→6.1→7→8
由此,要到达完全路径覆盖就必要操持9个测试用例,去掉不大概的环境路径三(由于A不大概同时满足A≤1,A=2两个条件),仍旧有8个用例。只管在消除隐蔽条件后办理了路径覆盖中的题目(2),但是完全路径覆盖的测试量比之前更加巨大。
八、根本路径覆盖



V(G) = 6-5+2 = 3
V(G) = 2+1 = 3
V(G) = 2个闭合地区+1个开放地区 = 3
无论使用哪种方法盘算,都可确定3条独立的路径,即根本路径覆盖的用例数。

  • 路径一:②⑥⑧,测试数据A=1,B=0,X=1 abd
  • 路径二:②③⑥⑧,测试数据A=3,B=0,X=1 acd
  • 路径三:②⑥⑦⑧,测试数据A=1,B=0,X=2 abe
思索:为什么②⑥⑧,②③⑥⑦⑧两个用例就可以将从②到⑧的路径全部覆盖,根本路径覆盖盘算的结果还必要三个用例?我个人明白的缘故原由是根本路径覆盖的一个测试用例一次只有一个变量因子。好比路径二相对路径一只有节点③发生了改变,路径三相对路径一只有节点⑦发生了改变。而如果只有②⑥⑧,②③⑥⑦⑧两个用例,固然覆盖到了全部路径,但一次有两个因子③和⑦都发生了变革,无法对单个条件变革的测试结果举行比对。

V(G) = 10-7+2 = 5
V(G) = 4+1 = 5
V(G) = 4个闭合地区+1个开放地区 = 5
无论使用哪种方法盘算,都可确定5条独立的路径,即根本路径覆盖的用例数。

  • 路径一:2.1→6.1→6.2→8,测试数据A=1,B=0,X=1 abid
  • 路径二:2.1→2.2→6.1→6.2→8,测试数据A=3,B=1,X=1 afgid
  • 路径三:2.1→2.2→3→6.1→6.2→8,测试数据A=3,B=0,X=1 afchid
  • 路径四:2.1→6.1→7→8,测试数据A=?,B=?,X=? abek
  • 路径五:2.1→6.1→6.2→7→8,测试数据A=1,B=0,X=2 abijk
操持测试数据时发现“路径四”abek不大概存在(由于A不大概同时满足A≤1,A=2两个条件),根据实际环境调解路径为afgek,对应的测试数据为A=2,B=1,X=1。
缺点:只管根本路径覆盖用例已经比完全路径覆盖的用例少了很多,但是当语句中有很多线性判断条件时,仍旧无法办理测试量指数上升的题目。
九、分割后的完全路径覆盖

如果消除隐蔽路径后,将步伐在必经节点处割断,分别对每一段步伐举行完全路径覆盖的充实测试,则即到达了完全路径覆盖的目的,又能对必经节点中的每个条件都举行考量,还大大镌汰了测试用例量。

分割后的控制流图和流程图
综合以上条件,得到测试用比方下:
A=1,B=0,X=1 aboid 输出:A=1,B=0,X=1
A=2,B=1,X=1 afgoek 输出:A=1,B=0,X=2
A=3,B=0,X=6 afchoijk 输出:A=1,B=0,X=2
终极得到的用例数为3,比步伐被分割之前的所需用例数少了很多,缓解了测试量过大的题目;另一方面,针对两个步伐片断实现了完全路径覆盖,办理了测试不敷的题目。前面所提到的不肯定覆盖全部条件组合环境下的BUG(未测试到的B≠0,X>1的环境,即将B=0误写为B>=0,X>1误写为X>2的错误),将会被测试用例2和测试用例3发现。
优点:分割后的完全路径覆盖方法,办理了前面所说的第(2)、(3)题目,不光对条件语句的每种环境都举行了考量,还防止了测试用例呈指数级上升的大概,办理了测试不敷和测试量过大之间的抵牾。
十、根本路径覆盖和分割后的完全路径覆盖用例对比



  • 根本路径用例(2)测试的是A>1,B≠0,X≤1的环境,在分割后的完全路径覆盖用例(2)中覆盖了A>1,B≠0的环境,在分割后的完全路径覆盖用例(1)中覆盖了X≤1的环境。
  • 根本路径用例(3)测试的是A>1,B=0,X≤1的环境,在分割后的完全路径覆盖用例(3)中覆盖了A>1,B=0的环境,在分割后的完全路径覆盖用例(1)中覆盖了X≤1的环境。
  • 根本路径用例(5)测试的是A≤1,B值忽略,X>1的环境,在分割后的完全路径覆盖用例(1)中覆盖了A≤1,B值忽略,在分割后的完全路径覆盖用例(3)中覆盖了X>1的环境。
结论:根本路径覆盖对比起分割后的完全路径覆盖方法,后者不光实现了路径覆盖,还思量到了条件语句的每种环境,而且用例数比根本路径覆盖更为精简,办理了完全路径覆盖和根本路径覆盖中复杂步伐用例呈指数级上升的题目。
末了感谢每一个认真阅读我文章的人,投桃报李总是要有的,固然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于做【软件测试】的朋侪来说应该是最全面最完备的备战堆栈,这个堆栈也陪同我走过了最艰巨的旅程,渴望也能资助到你!凡事要赶早,特别是技能行业,肯定要提升技能功底。

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表