白盒测试用例的设计(图文讲解,超详细)

正文

  • 语句覆盖:每条语句至少执行一次。
  • 判定覆盖:每个判定的所有可能结果至少出现一次。(又称“分支覆盖”)
  • 条件覆盖:每个条件的所有可能结果至少执行一次。
  • 判定/条件覆盖:一个判定中的每个条件的所有可能结果至少执行一次,并且每个判断本身的所有可能结果至少执行一次。
  • 多重条件覆盖(组合覆盖):每个判定中的所有可能的条件结果的组合,以及所有的入口点都至少执行一次。(注意“可能”二字,因为有些组合的情况难以生成。)
  • 完全路径覆盖:每条路径至少执行一次。
  • 基本路径覆盖:根据流图计算环复杂度,得到基本路径覆盖的用例数。
  • 分割后的完全路径覆盖:每条路径至少执行一次,每个条件的所有可能结果至少执行一次。

覆盖程度

路径覆盖 > 多重条件覆盖 > 判定/条件覆盖 > 条件覆盖 > 判定覆盖 > 语句覆盖

1. 路径覆盖是覆盖率最高的。语句覆盖最弱。
2. 满足多重条件覆盖准则的测试用例集,同样满足判定覆盖准则、条件覆盖准则和判定/条件覆盖准则。

任何一种覆盖方法都无法实现完全的测试。所以,在实际的测试用例设计过程中,根据需要将不同的覆盖方法组合起来使用,以实现最佳的测试用例设计 。

'假设有一个待测试的小程序,其Java源代码如下。使用以上白盒测试方法,完成对小程序的测试用例设计。'
public void foo (int a, int b, int x) {if(a>1 && b ==0) {x = x/a;}if (a==2 || x>1) {x = x+1;}
}

同时,在这我准备了一份软件测试视频教程(含接口、自动化、性能等),需要的可以直接在下方观看,或者直接关注VX公众号:互联网杂货铺,免费领取

软件测试视频教程观看处:

字节大佬教你逼自己如何在15天内掌握自动化测试(接口自动化/APP自动化/Web自动化/性能测试),内含项目实战

一、语句覆盖


使用此准则测试上述小程序,只需要遍历路径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的情况。

结论:基本路径覆盖对比起分割后的完全路径覆盖方法,后者不但实现了路径覆盖,还考虑到了条件语句的每种情况,并且用例数比基本路径覆盖更为精简,解决了完全路径覆盖和基本路径覆盖中复杂程序用例呈指数级上升的问题。

PS:这里分享一套软件测试的自学教程合集。对于在测试行业发展的小伙伴们来说应该会很有帮助。除了基础入门的资源,博主也收集不少进阶自动化的资源,从理论到实战,知行合一才能真正的掌握。全套内容已经打包到网盘,内容总量接近500个G。如需要软件测试学习资料,关注公众号(互联网杂货铺),后台回复1,整理不易,给个关注点个赞吧,谢谢各位大佬!

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/133503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源七轴myArm协作机械臂正逆运动学技术讲解

引言&#xff1a; 在本文中&#xff0c;我们将深入探讨机器人学的两个核心概念&#xff1a;正运动学和逆运动学。这两个概念是理解和控制机械臂运动的基础。通过一个具体的7轴机械臂实例&#xff0c;我们将详细介绍如何计算机械臂的正运动学和逆运动学。我们首先会解释正运动学…

uniapp 微信小程序 uni-file-picker上传图片报错 chooseAndUploadFile

这个问题真的很搞&#xff0c; 原因是微信开发者工具更新了&#xff0c;导致图片上传问题。 解决方法&#xff1a; 将微信开发者工具的基础库改为2.33.0一下即可。 在微信开发者工具详情 - 本地设置中&#xff08;记得点击‘推送’按钮&#xff09;&#xff1a;

【内功修炼】详解函数栈帧的创建和销毁

文章目录 1. 什么是函数栈帧2. 理解函数栈帧能解决什么问题呢&#xff1f;3. 函数栈帧的创建和销毁解析3.1 什么是栈&#xff1f;3.2 认识相关寄存器和汇编指令常见寄存器常用汇编指令 3.3 详解函数栈帧的创建和销毁3.3.1 函数的调用堆栈&#xff08;main函数也是被其它函数调用…

python用cv2画图(line, rectangle, text等)

Python做图像图形研究的时候&#xff0c;通常需要画很多辅助几何形状&#xff08;比如bounding box等&#xff09;。基于opencv的几何图形绘制具有易用性&#xff0c;而且天然能和numpy数组交互。 本文总结了几种常用的cv2画几何图形的方法&#xff0c;当一个简易的手册使用&a…

Go 定时任务实现

定时任务简介 定时任务是指按照预定的时间间隔或特定时间点自动执行的计划任务或操作。这些任务通常用于自动化重复性的工作&#xff0c;以减轻人工操作的负担&#xff0c;提高效率。在计算机编程和应用程序开发中&#xff0c;定时任务是一种常见的编程模式&#xff0c;用于周…

大数据疫情分析及可视化系统 计算机竞赛

文章目录 0 前言2 开发简介3 数据集4 实现技术4.1 系统架构4.2 开发环境4.3 疫情地图4.3.1 填充图(Choropleth maps)4.3.2 气泡图 4.4 全国疫情实时追踪4.6 其他页面 5 关键代码最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据疫…

智慧社区大屏:连接社区生活的数字桥梁

随着科技的不断发展&#xff0c;智慧社区已经不再只是未来的概念&#xff0c;它已经在我们的眼前悄然崭露头角。智慧社区是一种基于数字技术的社区管理和生活方式&#xff0c;旨在提高社区的安全性、便利性和生活质量。而在这个数字化的社区中&#xff0c;智慧社区大屏起到了连…

Spire.Office for .NET 8.10.2 同步更新-Crk

Spire.Office for .NET是 E-iceblue 提供的企业级 Office .NET API 的组合。它包括Spire.Doc、Spire.XLS、Spire.Spreadsheet、Spire.Presentation、Spire.PDF、Spire.DataExport、Spire.OfficeViewer、Spire.PDFViewer、Spire.DocViewer、Spire.Barcode和Spire.Email。Spire.O…

一文深入搞懂ARM处理器架构

1、嵌入式处理器基础 典型的微处理器由控制单元、程序计数器&#xff08;PC&#xff09;、指令寄存器&#xff08;IR&#xff09;、数据通道、存储器等组成 。 指令执行过程一般分为&#xff1a; 取指&#xff1a; 从存储器中获得下一条执行的指令读入指令寄存器&#xff1…

对“Fork”做一个技术方面的简介

使用过 GitHub 的人大多知道它上面有个“Fork”的功能&#xff0c;用来将某个仓库克隆到你的账户之下&#xff0c;从而可以对其进行修改、衍生&#xff0c;也可以比较方便的将你的修改推回到原来的仓库&#xff08;所谓的上游&#xff09;。 随着 GitHub 的流行&#xff0c;我…

基于鹈鹕算法的无人机航迹规划-附代码

基于鹈鹕算法的无人机航迹规划 文章目录 基于鹈鹕算法的无人机航迹规划1.鹈鹕搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用鹈鹕算法来优化无人机航迹规划。 1.鹈鹕搜索算法 …

什么是微服务?与分布式又有什么区别?

什么是微服务&#xff0c;我们先从传统的单体结构进行了解&#xff0c;对两者进行对比。 单体结构 单体结构是一种传统的软件架构模式&#xff0c;它将应用程序划分为一组相互依赖的模块和组件。这些模块和组件通常都是构建在同一个平台上的&#xff0c;并且紧密耦合在一起。…

一款简简单单基于AIGC的文档翻译软件

一款文字/文件翻译的网站,支持多个领域的翻译&#xff0c;支持常见的语言翻译(韩/日/法/英/俄/德…),最大百分比的保持原文排版(及个别除外基本100%还原)。 新用户注册就有100页的免费额度&#xff0c;每月系统还会随机赠送翻译额度&#xff0c;说实话这比好多的企业要好的多了…

双十一电视盒子哪个牌子最好?老烧分享电视盒子品牌排行榜

在挑选电视盒子时很多人踩雷&#xff0c;我自己买过十来款电视盒子&#xff0c;存在不少问题&#xff0c;双十一这段时间身边买电视盒子的都会问我电视盒子哪个牌子最好&#xff0c;我今天来分享的是业内最专业的电视盒子品牌排行榜&#xff0c;双十一想买电视盒子可以从下面这…

人大金仓KingbaseES_V008R006C008B0014安装

人大金仓安装 一、安装前准备工作 1、硬件环境要求 KingbaseES支持通用X86_64、龙芯、飞腾、鲲鹏等国产CPU硬件体系架构。 2、软件环境要求 KingbaseES支持各种主流的Linux操作系统64位发行版本&#xff0c;包括CentOS、中标麒麟、银河麒麟、统信UOS、Deepin、凝思、中科方…

ConvNets 与 Vision Transformers:数学深入探讨

一、说明 我目睹了关于 Vision Transformer 的争论&#xff0c;讨论它们如何与 CNN 一样好或更好。我想知道我们是否也同样争论菠萝比西瓜好&#xff01;或者马比海豚更好&#xff1f;其中许多讨论往往缺乏具体性&#xff0c;有时可能会歪曲上下文。 作为背景&#xff0c;在快速…

【owt】p2p client mfc 工程梳理

1年前构建的,已经搞不清楚了。所以梳理下,争取能用较新的webrtc版本做测试。最早肯定用这个测试跑通过 【owt】p2p Signaling Server 运行、与OWT-P2P-MFC 交互过程及信令分析官方的mfc客户端 估计是构造了多个不同的webrc版本的客户端

Spring:常见的面试题和答案

1、什么是 Spring 框架&#xff1f;Spring 框架有哪些主要模块&#xff1f; Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。 Spring 帮助开发者解决了开发中基础性的问题&#xff0c;使得开发人员可以专注于应用程序的开发。 Spring 框架…

Find My手机保护壳|苹果Find My与手机保护壳结合,智能防丢,全球定位

随着科技水平的快速发展&#xff0c;科技美容这一行业做为新型产业新生而出。时尚IT品牌随着市场的多元化发展。针对手机品牌和功能的增加而呈多样化&#xff0c;将手机保护壳按质地分有PC壳&#xff0c;皮革 &#xff0c;硅胶&#xff0c;布料&#xff0c;硬塑&#xff0c;皮套…

OpenAI史诗级更新,最强大模型炸场,128K上下文、价格暴降2/3,定制专属GPT快到只需5分钟

今早&#xff0c;2023年最瞩目的人工智能大会举办&#xff01; CSDN11月7日报道&#xff0c;今天凌晨2点&#xff0c;在OpenAI首届开发者大会上&#xff0c;OpenAI的首席执行官萨姆•阿尔特曼&#xff08;Sam Altman&#xff09;宣布了GPT-4、ChatGPT的年度最重磅更新。 OpenA…