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

黑盒测试之因果图

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

因果图思想的形成

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

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

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

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


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

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

  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角

啤酒

灯亮,送出啤酒

相关推荐

Chrome OS 41 用 Freon 取代 X11_chrome os atom

在刚发布的ChromeOS41里,除了常规的Wi-Fi稳定性提升(几乎所有系统的changelog里都会包含这一项)、访客模式壁纸等之外,还存在底层改变。这一更新中Google移除...

苹果iPad Pro再曝光 有望今年六月发布

自进入2015年以后,有关大屏iPad的消息便一直不绝于耳,之前就有不少媒体猜想这款全新的平板电脑将会在三月发布,不过可惜的是我么只在那次发布会上看到了MacBookPro。近日@Ubuntu团队便...

雷卯针对香橙派Orange Pi 5 Max开发板防雷防静电方案

一、应用场景高端平板、边缘计算、人工智能、云计算、AR/VR、智能安防、智能家居、Linux桌面计算机、Linux网络服务器、Android平板、Android游戏机...

Ubuntu Server无法更新问题解决_ubuntu server not found

上周老家的一台运行UbuntuServer的盒子无法连接上了,中秋这两天回来打开,顺手更新一下发现更新报错。提示`E:Releasefileforhttps://mirrors.aliyun...

虚幻引擎5正式版发布:古墓丽影&巫师新作采用、新一代实时渲染

机器之心报道编辑:杜伟、陈萍虚幻引擎5的目标是「助力各种规模的团队在视觉领域和互动领域挑战极限,施展无限潜能」。...

AMD Milan-X双路霄龙7773X平台基准测试曝光 CPU缓存总量超1.5GB

OpenBenchmarking基准测试数据库刚刚曝光了AMDMilan-X双路霄龙7773X平台的跑分成绩,虽然很快就被撤下,但我们还是知晓了高达1.6GB的总CPU缓存。早些时...

ROS机器人建模_ros机器人硬件搭建

...

全网最新的Dify(1.7.2)私有化离线部署教程(ARM架构)

Hello,大家好!近期工作中有涉及到Dify私有化离线部署,特别是针对于一些国产设备。因此特别整理了该教程,实测有效!有需要的小伙伴可以参考下!本文主要针对Dify1.7.2最新版本+国产操作系...

在ubuntu下新建asp.net core项目_创建ubuntu

本文一步步讲述在ubuntu下用visualstudiocode创建asp.netcore项目的过程。step1:环境操作系统:virtualbox下安装的lubuntu。请不要开启“硬件...

在晶晨A311D2处理器上进行Linux硬件视频编码
在晶晨A311D2处理器上进行Linux硬件视频编码

在KhadasVIM4AmogicA311D2SBC上,我更多的时间是在使用Ubuntu22.04。它的总体性能还不错,只不过缺少3D图形加速和硬件视...

2025-08-26 17:22 haoteby

Nacos3.0重磅来袭!全面拥抱AI,单机及集群模式安装详细教程!

之前和大家分享过JDK17的多版本管理及详细安装过程,然后在项目升级完jdk17后又发现之前的注册和配置中心nacos又用不了,原因是之前的nacos1.3版本的,版本太老了,已经无法适配当前新的JD...

电影质量级渲染来了!虚幻引擎5.3正式发布:已开放下载

快科技9月8日消息,日前,Unrealengine正式发布了虚幻引擎5.3,带来了大量全方位的改进。...

2025如何选购办公电脑?极摩客mini主机英特尔系列选购指南

当下,迷你主机的性能越来越强,品类也越来越多。但是CPU是不变的,基本都是AMD和英特尔的。有一个小伙伴在评论区提问,我应该如何在众多机器中选购一台符合自己的迷你主机呢?那今天我们优先把我们的系列,分...

ubuntu 20.04+RTX4060 Ti+CUDA 11.7+cudnn

ububtu添加国内源sudocp/etc/apt/sources.list/etc/apt/sources.list.backupsudovim/etc/apt/sources.lis...

Linux Mint 18将重新基于Ubuntu 16.04 带来更好硬件支持

项目负责人ClementLefebvre在本月6日披露了关于LinuxMint18“Sarah”操作系统的大量信息,包括带来全新扁平化体验的Mint-Y主题。而现在,这款将于年底之前上线的操作...