黑盒测试之因果图
haoteby 2025-04-24 00:22 16 浏览
因果图思想的形成
在之前我介绍的等价划分方法和边界值分析方法,他们都是侧重于对单一的输入条件的分析,而事实上,对于一个程序,它的输入条件之间不会一直是相互独立的,多数情况下,这些输入条件会形成依赖,形成组合效应,相辅相成地影响程序的输出,因此,必须要有一种方法来描述输入(尤其是输入条件组合时)和输出之间的依赖关系,于是就形成了因果图思想。
因果图就是一种图形化工具,它描述输入条件的组合及其对应的输出。
输入条件的组合及其对应的输出,即输入条件以“与”,“或”,“非”的逻辑运算组合形式存在时,程序会产生什么样的运算结果,这就是我说的输入条件形成的组合效应,另外,可能一个输入条件和另一个输入条件之间会是互斥的、同一的的,这就是我说的输入条件之间形成的依赖关系,从形式上来看,因果图是一种形式语言,极其类似于组合逻辑网络。
我们不得不承认,因果图是一种系统的方法,这种方法是对规格说明的综合分析和考量,对测试开发人员有比较高的要求,用这种方法不仅能帮助我们设计出高效的测试用例,而且能帮助我们发现规格说明中不完整性和模糊性(不明确之处)。
运用因果图设计测试用例的过程
用该方法设计测试用例的一个的推荐过程:
- 分解:将规格说明分解为可执行的片段。这是出于把复杂问题简单化的考虑,使我们能更好地设计因果图,系统越复杂越是需要对其行为进行分解,比如一个管理路由器的web页面测试,我们可能只单独测试它的web登录页面,路由器管理页面的一个子菜单功能页面(比如拨号上网)。
- 提炼“因”和“果”并为其编号:从对规格说明的解读中确定因果关系,从而获得所有因和所有果。“因”是指一个明确的输入条件或输入条件的等价类,“果”是指一个输出条件或系统转化(输入对程序或系统状态的延续影响)。如ATM机,用户插入银行卡,银行卡磁条向下是一个输入条件,ATM机屏幕上显示登陆界面就是一个输出条件,即是插入的银行卡磁条朝下这一输入条件对ATM机系统的影响。
- 因果图:分析规格说明的语义内容,并将其转换为连接因果关系的布尔图。
- 注解:用以说明由于语法或环境的限制而不能联系起来的“因”和“果”。
- 有限项的判定表:我们需要仔细地跟踪因果图中的状态变化情况。
- 测试用例:基于判定表中的列逐个地生成测试用例。
构成因果图的基本符号及其运用
前面我们提到过因果图是极其类似于逻辑网络图的,那么下面我们就来看一下构成因果图的基本符号,假设0代表“不存在”,1代表“存在”。
- identity函数表示a等于1,则b等于1,a和b是等同的,图示为
- NOT函数表示如果a等于1,则b为0;否则b为1,图示为
- OR 函数表示a或b或c等于1,则d为1;否则d为0,图示为
- AND 函数表示a和b都等于1,则c为1;否则c为0,图示为
考虑下面这样的一个规格说明:
登录名首字符必须是“A”或“B”,第二个字符必须是一个数字。在这种情况下进行授权登录,如果第一个字符不正确,产生提示信息X1,如果第二个字符不是数字,产生提示信息X2。
提炼出“因”和“果”并对其编号,如下
因 | 编号 |
第一个字符是“A” | 1 |
第一个字符是“B” | 2 |
第二个字符是一个数字 | 3 |
果 | 编号 |
登录成功 | 70 |
产生提示信息X1 | 71 |
产生提示信息X2 | 72 |
分析因果关系,我们能画出如下的因果图:
以下逻辑图是与该图等价的
从该实例,我们更能够坚信一个事实,就是因果图和数字逻辑电路里的组合逻辑电路图是极其相似的。
到这里,我们已经能用图示来描述输入条件的组合效应了,那么输入条件之间的依赖关系应该如何用图符来描述呢?首先,我们应该要知道输入条件之间有哪些依赖关系,然后才能逐个地用图符来表示
第一,我们定义约束E表示其必须总为真,而a和b最多只有一个为1,其描述了输入条件之间存在互斥排它性。对于上例,显而易见,原因1和原因2不可能同时设置为1,我们说原因1和原因2之间具有互斥性。
第二,我们定义约束I表示其为真时,a,b,c中至少有一个应为1(a、b、c不能同时为0),其描述了输入条件之间存在包含关系。
第三,我们定义约束O表示a、b中有且仅有一个必须为1,其描述输入条件之间存在唯一性。
第四,我们定义约束R表示如果a为1,b也必须为1(如a为1而b为0的情况是不可能的),其描述输入它条件之间存在需求性。
第五,我们定义约束M表示如果结果a为0,则b强制为0,其描述输出条件具有“屏蔽性”,这是从结果方面考虑而形成的一种约束。
以上,总共5种约束,其图符表示如下
实例演示
事实上,因果图只是一种图形化工具,它能帮助我们全面细致的分析规格说明里存在的输入输出之间的组合逻辑而不会导致遗漏,同时也提供了一种直观的语言更加形象的描述这种组合逻辑,所以,我们能通过这个因果图,发现出规格说明中不完整和不明确之处。当然我们确定输入输出之间的组合逻辑并不总是需要用因果图,对于比较简单的组合逻辑关系,我们可以直接列出判定表,从而从判定表生成测试用例。
下面,我们从一个实例来演示因果图方法的应用。
有一个单价为五角钱的饮料自动售货机软件,对其采用因果图方法设计测试用例。需求如下:
- 若售货机没有零钱找,则一个显示 “零钱找完”的红灯亮,以提示顾客在此情况下不要投入1元钱,否则此红灯不亮。
- 顾客投入5角硬币,然后按下“橙汁”或“啤酒”按钮,则相应的饮料被送出。
- 顾客投入1元硬币并按下“橙汁”或“啤酒”按钮后,若售货机没有零钱找,则显示“零钱找完”的红灯亮,1元硬币被退出,且无饮料送出;若有零钱找,则五角硬币被退出且饮料被送出。
第一步:提炼出“因”和“果”,并给每个“因”和每个“果”编号,如下
因 | 编号 |
售货机有零钱找 | 1 |
投入1角硬币 | 2 |
投入5角硬币 | 3 |
按下“橙汁”按钮 | 4 |
按下“啤酒”按钮 | 5 |
果 | 编号 |
售货机“零钱找完”的红灯亮 | 21 |
退出1元硬币 | 22 |
退出5角硬币 | 23 |
送出“橙汁”饮料 | 24 |
送出“啤酒”饮料 | 25 |
第二步,根据列出的因和果,结合规格说明中的语义内容增加中间节点,如下
中间节点 | 编号 |
投入1元硬币并按下“橙汁”或“啤酒”按钮 | 11 |
按下“橙汁”或“啤酒”按钮 | 12 |
退还5角零钱且售货机有零钱找 | 13 |
钱已付清 | 14 |
第三步,画出因果图
第四步,生成判定表,运用回溯法
回溯算法的过程如下:
1、选择一个“果”作为当前状态(1)
2、对因果图进行回溯,查找导致该“果”为1(根据约束条件)的所有“因”的组合
3、在判定表中为每个“因”的组合生成一列
4、对于每种“因”的组合,判断所有其他“果”的状态,并放置在每一列中。
在执行第二步时,需要做以下考虑:
1、当回溯经过一个结果应为1的or节点时,不要同时将该or节点的一个以上的输入设置为1。
2、当回溯经过一个结果应为1的and节点时,应当列出导致结果为0的所有输入组合情况。
3、当回溯经过一个结果应为1的and节点时,仅有一种所有输入皆为0的情况
需要列举出来。
Note:在构成的以下判定表中,原因、中间节点、结果的取值为0表示其代表的状态不出现;为1表示状态出现。中间节点与结果没有值,代表因违反约束而不会出现的情况。
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |
原因 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | |
3 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | |
4 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | |
5 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | |
中间节点 | 11 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | ||
12 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |
13 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||
14 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | |
结果 | 21 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
22 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | |
23 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
24 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | |
25 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
第五步,生成测试用例
以上判定表,我没有把所有的输入条件组合都列出来,如不作任何操作的情况,投币却没有选择饮料等,剩余没列出来的这些情况可以归纳为“无效列”,“无效”并不说它没有任何用处,我说的“无效”是说它并不会对我们生成测试用例有实质性的帮助,但是这些“无效列”能帮助我们改善需求,比如对于投币却没有选择饮料的情况,可以考虑对需求做一下完善:若投币N秒后仍没有选择饮料,售货机上“请选择饮料”灯亮。进而根据需求规格说明改进因果图和判定表。
当然,也不是列入判定表里面的所有项都能生成有效的测试用例,比如之选择饮料却没有投币的情况,基于此,我们又可以对需求做以下完善:只选择饮料却没有投币时,自动售货机上“请投币”的灯亮。进而根据需求规格说明改进因果图和判定表。
还有,我们注意到有一种特殊情况,在自动售货机没零钱找的情况下投入五角钱,此时自动售货机进入有零钱找状态,由于需求说明没有考虑这一特殊状态,故判定表中第9、10列的21号结果没有从1变成0实际上是不正确的。在需求规格说明书中应对此种情况加以考虑,进而改进因果图和判定表。
还有一种特殊情况,1、2列对应的是自动售货机在有零钱的情况下找了5角钱,此刻自动售货机有可能进入无零钱找的状态,由于需求说明没有考虑这一特殊状态,故判定表中第1、2列的21号结果从1变成0实际上是不一定是正确的。在需求规格说明书中应对此种情况加以考虑,进而改进因果图和判定表。
综合考虑后,以下就是我们设计的测试用例
用例编号 | 有无零钱 | 投入金额 | 饮料 | 预期结果 |
case01 | 有 | 1元 | 橙汁 | 退回5角,送出橙汁 |
case02 | 有 | 1元 | 啤酒 | 退回5角,送出啤酒 |
case03 | 有 | 5角 | 橙汁 | 送出橙汁 |
case04 | 有 | 5角 | 啤酒 | 送出啤酒 |
case05 | 无 | 1元 | 橙汁 | 灯亮,退回1元 |
case06 | 无 | 1元 | 啤酒 | 灯亮,退回1元 |
case07 | 无 | 5角 | 橙汁 | 灯亮,送出橙汁 |
case08 | 无 | 5角 | 啤酒 | 灯亮,送出啤酒 |
相关推荐
- 网站seo该怎么优化
-
一、网站定位在建设一个网站之前,我们首先要做的就是一个网站清晰的定位,会带来转化率相对较高的客户群体,我们建站的目的就是为了营销,只有集中来做某一件事,才会更好的展现我们的网站。在做SEO优化的同时...
- 3个小技巧教你如何做好SEO优化
-
想半路出家做SEO?可是,怎么才做的好呢?关于SEO专业技术弄懂搜索引擎原理,咱们做搜索引擎排名的首先就是要了解搜索引擎的工作原理,对SEO优化有更深入了解之后再来做SEO,你就能从搜索引擎的视点...
- SEO指令分享:filetype指令
-
filetype用于搜索特定的文件格式。百度和谷歌都支持filetype指令。比如搜索filetype:pdf今日头条返回的就是包含今日头条这个关键词的所有pdf文件,如下图:百度只支持:pdf...
- 网站seo优化技巧大全
-
SEO在搜索引擎中对检索结果进行排序,看谁最初是在用户的第一眼中看到的。实际上,这些排名都是通过引擎的内部算法来实现的。例如,百度算法很有名。那么,对百度SEO的优化有哪些小技巧?下面小编就会说下针对...
- 小技巧#10 某些高级的搜索技巧
-
由于某些原因,我的实验场所仅限百度。1.关键词+空格严格说来这个不能算高级,但关键词之间打空格的办法确实好用。我习惯用右手大拇指外侧敲击空格键,这个习惯在打英文报告时尤其频繁。2.site:(请不要忽...
- MYSQL数据库权限与安全
-
权限与安全数据库的权限和数据库的安全是息息相关的,不当的权限设置可能会导致各种各样的安全隐患,操作系统的某些设置也会对MySQL的安全造成影响。1、权限系统的工作原理...
- WPF样式
-
UniformGrid容器<UniformGridColumns="3"Rows="3"><Button/>...
- MySQL学到什么程度?才有可以在简历上写精通
-
前言如今互联网行业用的最多就是MySQL,然而对于高级Web面试者,尤其对于寻找30k下工作的求职者,很多MySQL相关知识点基本都会涉及,如果面试中,你的相关知识答的模糊和不切要点,基...
- jquery的事件名称和命名空间的方法
-
我们先看一些代码:当然,我们也可以用bind进行事件绑定。我们看到上面的代码,我们可以在事件后面,以点号,加我们的名字,就是事件命名空间。所谓事件命名空间,就是事件类型后面以点语法附加一个别名,以便引...
- c#,委托与事件,发布订阅模型,观察者模式
-
什么是事件?事件(Event)基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。通过委托使用事件事件在类中声明且生成,且通过...
- 前端分享-原生Popover已经支持
-
传统网页弹窗开发需要自己处理z-index层级冲突、编写点击外部关闭的逻辑、管理多个弹窗的堆叠顺序。核心优势对比:...
- Axure 8.0 综合帖——新增细节内容
-
一、钢笔工具与PS或者AI中的钢笔工具一样的用法。同样有手柄和锚点,如果终点和起点没有接合在一起,只要双击鼠标左键即可完成绘画。画出来的是矢量图,可以理解为新的元件。不建议通过这个工具来画ICON图等...
- PostgreSQL技术内幕28:触发器实现原理
-
0.简介在PostgreSQL(简称PG)数据库中,触发器(Trigger)能够在特定的数据库数据变化事件(如插入、更新、删除等)或数据库事件(DDL)发生时自动执行预定义的操作。触发器的实现原理涉及...
- UWP开发入门(十七)--判断设备类型及响应VirtualKey
-
蜀黍我做的工作跟IM软件有关,UWP同时会跑在电脑和手机上。电脑和手机的使用习惯不尽一致,通常我倾向于根据窗口尺寸来进行布局的变化,但是特定的操作习惯是依赖于设备类型,而不是屏幕尺寸的,比如聊天窗口的...