百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

黑盒测试之因果图

haoteby 2025-04-24 00:22 47 浏览

因果图思想的形成

在之前我介绍的等价划分方法和边界值分析方法,他们都是侧重于对单一的输入条件的分析,而事实上,对于一个程序,它的输入条件之间不会一直是相互独立的,多数情况下,这些输入条件会形成依赖,形成组合效应,相辅相成地影响程序的输出,因此,必须要有一种方法来描述输入(尤其是输入条件组合时)和输出之间的依赖关系,于是就形成了因果图思想。

因果图就是一种图形化工具,它描述输入条件的组合及其对应的输出。

输入条件的组合及其对应的输出,即输入条件以“与”,“或”,“非”的逻辑运算组合形式存在时,程序会产生什么样的运算结果,这就是我说的输入条件形成的组合效应,另外,可能一个输入条件和另一个输入条件之间会是互斥的、同一的的,这就是我说的输入条件之间形成的依赖关系,从形式上来看,因果图是一种形式语言,极其类似于组合逻辑网络。

我们不得不承认,因果图是一种系统的方法,这种方法是对规格说明的综合分析和考量,对测试开发人员有比较高的要求,用这种方法不仅能帮助我们设计出高效的测试用例,而且能帮助我们发现规格说明中不完整性和模糊性(不明确之处)。


运用因果图设计测试用例的过程

用该方法设计测试用例的一个的推荐过程:

  1. 分解:将规格说明分解为可执行的片段。这是出于把复杂问题简单化的考虑,使我们能更好地设计因果图,系统越复杂越是需要对其行为进行分解,比如一个管理路由器的web页面测试,我们可能只单独测试它的web登录页面,路由器管理页面的一个子菜单功能页面(比如拨号上网)。
  2. 提炼“因”和“果”并为其编号:从对规格说明的解读中确定因果关系,从而获得所有因和所有果。“因”是指一个明确的输入条件或输入条件的等价类,“果”是指一个输出条件或系统转化(输入对程序或系统状态的延续影响)。如ATM机,用户插入银行卡,银行卡磁条向下是一个输入条件,ATM机屏幕上显示登陆界面就是一个输出条件,即是插入的银行卡磁条朝下这一输入条件对ATM机系统的影响。
  3. 因果图:分析规格说明的语义内容,并将其转换为连接因果关系的布尔图。
  4. 注解:用以说明由于语法或环境的限制而不能联系起来的“因”和“果”。
  5. 有限项的判定表:我们需要仔细地跟踪因果图中的状态变化情况。
  6. 测试用例:基于判定表中的列逐个地生成测试用例。

构成因果图的基本符号及其运用

前面我们提到过因果图是极其类似于逻辑网络图的,那么下面我们就来看一下构成因果图的基本符号,假设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角

啤酒

灯亮,送出啤酒

相关推荐

DIY桌面激光雕刻机#是时候展现真正的技术了

激光雕刻机。这期视频我们来看一下我是如何DIY一台桌面激光雕刻机。前几天在水池子边上发现了一台旧电脑,我看这电脑上还有一些东西可以利用到,比如光驱上面拆出了步进电机和滑轨。所以本期视频我将用这些废品去...

100000块多米诺骨牌拼成超级马里奥,这款机器人1天就完成了

智东西(公众号:zhidxcom)编译|王健恩编辑|高歌智东西7月30日消息,美国工程师兼YouTube博主MarkRober创造出了一个可以自动摆放多米诺骨牌的机器人。这个机器人被命名为D...

这个3D打印机器人可以在30秒内打开密码锁

密码锁看似很安全?也许曾经是,但现在你可要当心了!这是因为一台3D打印制造的机器人就可以在半分钟内打开你的密码锁。上周四,知名黑客萨米·卡姆卡尔(SamyKamkar)在自己的网站上公布了一个称之为...

密码锁也不安全 这款机器人30秒即可自动打开

大学生和体育爱好者们要注意了,千万不要再把贵重物品存放在公共储物柜里。因为现在已经出现了一种3D打印的机器人,据说世界上各大锁商推出的大部分密码锁,它都能够在30秒之内打开。著名黑客山米·卡姆卡(Sa...

硬件单片机模拟器,再也不用买开发板了...

#头条创作挑战赛#记得2006年在凌阳科技(sunplus)工作的时候,凌阳科技开发了自己的编译器/集成开发环境(unspIDE),那个IDE除了有keil那样的编辑器、编译器、链接器、调试器、下载...

3D打印机分哪几部分构成?(3d打印机结构组成及系统分析)

3D打印机的构成根据技术类型(如FDM、SLA、SLS等)有所不同,但以最常见的FDM(熔融沉积成型)3D打印机为例,其核心组成部分可分为以下模块:1.机械结构框架提供整体支撑和稳定性,常见材质为金...

初学者学伺服都需要什么?石家庄诺仕通

#初学者学伺服都需要什么?#对于初学者学习伺服系统,需要从...

arduino(arduino是单片机吗)

arduino学习笔记arduino学习笔记1-什么是arduino?...

自制写字机,你需要的全套资料都在这里

小编之前发过《用废旧光驱制作迷你绘图仪》,很多读者都成功制作了自己的绘图仪。但是该方法的缺点是gcode要在inkscape软件中生成,然后通过grbl-controller这个没有界面的程序发送画图...

自己动手DIY3D打印机 瞬间效果出现桌面时,大家都惊呆了!

3D打印机,对数码产品比较了解的朋友都知道,但是真正玩过的童鞋可能就不多了。其实3D打印机离我们并不远,随着3D打印技术越来越成熟,3D打印机的学习资料也越来越多,这让自己动手做一台桌面3D打印机也成...

机器人仅用24小时将十万块多米诺骨牌拼出马里奥,创下世界纪录

十万块多米诺骨牌倒下是个啥场面?等等,十万块?那得搭多久啊?...

如何制作一个机器人?(制作机器人的方法)

1.简单机械机器人(例如自动小车)2.智能机器人(带有人工智能或计算机视觉)3.工业机器人(用于生产自动化)4.人形机器人(类人结构,可以行走、对话)...

CrowPi2树莓派4学习套件评测第1部分–开箱和首次启动

文章来源:CNXSoftware中文站2020年6月,我曾写过一篇关于深圳易科诺...

基于 Arduino UNO 的蓝牙汽车(arduino智能小车蓝牙控制app)

HC-05蓝牙模块HC-05是一款易于使用的蓝牙SPP模块,针对流畅的串行无线通信配置进行了优化。串口蓝牙模块是完全合格的蓝牙V2.0+EDR(增强数据速率)3Mbps调制,具有总2.4...

电机驱动设计方案带你初识机电一体化

在直流电机驱动电路的设计中,主要考虑以下几点:功能:电机是单向还是双向转动?需不需要调速?...