测试设计方法:因果图的基本原理及运用
本文最后更新于:2025年7月3日 晚上
1、引言
因果图,作为一种黑盒测试方法,经常用来作为复杂场景的案例设计工具,尤其是针对逻辑关系、依赖关系强的场景,而正因为这一点,很好的弥补了我前面讨论的正交试验的不足之处。因果图能够用来研究条件与结果之间的逻辑关系的变化,很好的发现和探索其中的因果之变,下面来探究如何来这一种方法的原理,以及如何使用因果图来设计测试案例。
2、因果图基本原理及定义
因果图是一种针对输入条件的组合进行分析的一种设计方法,基于图的原理,将输入内容和输出结果进行组合和联系。与正交实验不同,因果图不要求输入条件为独立特性,允许条件之间存在相互依赖或相互约束的关系,重点探究的是从输入到输出之间的因果逻辑。
3、因果图设计步骤
从需求分析到用因果图生成用例,大致步骤如下:
1)拆解需求:
- 从最初的需求中,将其拆解为小段的逻辑片段,通过分析逻辑片段来进行因果图分析。
2)确定“因”和“果”:
- 从需求片段中提取到的所有可能的输入条件和输出结果,这些即为因果图中的原因和结果。例如,在自动饮用水售货机中,投入1元硬币购买,当定价1元时,得到的结果是“购买成功”,投币1元是“因”,“购买成功”是“果”。
3)明确因果关系及约束关系:
- 因果关系即为“原因”通过什么样的方式得到什么样的“结果”,原因和结果之间的对应关系即为因果关系。
- 约束关系为条件之间的各种限制,如条件A和条件B同时满足才能得到结果A。实际的例子如自动饮用水售货机,投币1元和商品定价1元,当两个条件同时满足时,才能购买成功,当定价2元时,会是“购买失败,请充值”的结果,这个例子里面“投币1元”和“定价1元”两个条件之间便是互斥关系。
4)绘制因果图:
对步骤2分析得到的和输出结果制定编号,每个编号代表1个节点,将输入条件置为左列,输出结果置为右列。利用因果图的基本符号,将输入和输出之间连接,便得到初始因果图。
**Tips:**当输入内容较为复杂时,考虑增加中间节点,中间节点仅为输入条件特定情况下的某种状态,用于方便绘制输入和输出之间的联系,仅用于桥梁的作用。
5)补充因果约束条件:
- 根据步骤3得到的因果和约束关系,结合约束符号,在初始因果图上补充注明输入条件之间的约束关系,添加约束之后即可得到完整的因果图。
6)将因果图转为判定表:
- 对每个原因和结果取真和假两种状态,用 0 和 1 表示,根据完整的因果图生成有限项判定表,将所有的状态组合列出,再根据因果图中的约束条件,去掉不可能出现的组合。
7)根据判定表转换为测试用例:
- 根据判定表中每一列的值作为依据,设计测试用例,每个有效的列都是一个测试用例。
4、基本符号与约束关系
4.1 基本因果图符号
逻辑关系 | 说明 | 图示 |
---|---|---|
恒等 (Identity) | 如果原因a为真,则结果b为真,中间直线相连接 | ![]() |
非 (NOT) | 如果原因a为真,则结果b为假;反之,如果a为假,则b为真 | ![]() |
或 (OR) | 如果多个原因 $a_1$, $a_2$, …, $a_n$中至少有一个为真,条件数目任意,则结果d为真。图形上使用一个“∨”或“OR”标记 | ![]() |
与 (AND) | 只有当所有原因$a_1$, $a_2$, …, $a_n$均同时为真时,结果d才为真。图形上使用一个“∧”或“AND”标记。 | ![]() |
4.2 约束关系
约束关系 (Constraint Relationships):用于表示原因之间由于语义、环境或业务规则限制而导致某些组合不可能出现或必须同时出现的情况。这些约束通常作用于一组原因节点之间。
约束关系 | 说明 | 图示 |
---|---|---|
E (Exclusive, 互斥) | 表示在$a_1$…$a_n$中,整体必须总为真,最多仅有1个为真。如果出现多个原因为真的情况,则该组合是非法的。例如,一个单选按钮组,只能选择一个选项。 | ![]() |
I (Inclusive, 包含/或) | 表示在$a_1$…$a_n$中,至少有一个原因必须为真。如果所有原因都为假,则该组合是非法的。例如,支付方式至少选择一种。 | ![]() |
O (One and Only One, 唯一) | 表示在$a_1$…$a_n$中,必须有且仅有一个原因为真。这是E和I约束的结合。 | ![]() |
R (Requires, 要求) | 表示如果原因a为真,那么原因b也必须为真。即a的发生以b的发生为前提。 | ![]() |
M (Mask, 屏蔽) | 对条件b进行屏蔽,表示如果原因a(屏蔽条件)为真,那么某个结果E必定为假(或不发生),若a为假,则结果E的值不一定,需考虑b。 | ![]() |
因果图初稿示例:节点4为中间节点,用于共享1、2的状态
带有约束关系的因果图示例:
5、判定表的介绍
判定表,也称为决策表,是一种表达逻辑判断的工具,能够用来分析不同的操作下的结果如何,是分析和表达多逻辑条件下与不同操作间的逻辑情况的有效利器。判定表经常用于因果图的测试设计当中,两者密不可分,相辅相成。在因果图的设计当中,判定表被视为因果图的最终成果体现,通过一个因果图能否得到高质量的判定表也常常是我们在因果图案例设计中所追求的一个目标。
下面来介绍判定表的简要结构,包含4个部分:
- 1、条件桩(Condition Stub):包含所有的输入条件,与各条件之间相互独立无影响。
- 2、动作桩(Action Stub):所有可能采取的动作,即输出条件,所有输出条件之间无影响。
- 3、条件项(Condition Entry):针对条件桩下,每个条件下,所有可能的取值,真或者假。
- 4、动作项(Action Entry):列出所有可能的操作项,当与条件操作相匹配时为真,其他为假。
完整判定表结构如下:
其中,条件项与动作项组成的每一列记录,即为一个规则,这是判定表的细节组成部分,最终也是通过这一部分生成我们的测试案例。
6、实践案例
6.1 案例一:文件修改功能测试
一个应用程序,根据输入的第一列(字符)和第二列(数字)判断是否修改文件。若第一列非 A/B,输出错误信息 N;若第二列非数字,输出错误信息 M;若均正确,则修改文件。
分析步骤如下:
1、确定输入和输出:
- 原因(输入条件):
序号 输入项 编号 1 第一列为A 1 2 第一列为B 2 3 第一列为非A/B 3 4 第二列为数字 4 5 第二列为非数字 5 - 中间节点: 第一列为A或B - 编号11
- 结果(输出): 修改文件、输出错误信息 N、输出错误信息 M。
序号 结果项 编号 1 修改文件 21 2 输出错误信息N 22 3 输出错误信息M 23 2、确定因果关系及约束关系:
因果关系:
第一列为A或B、第二列为数字,修改文件。
第一列非 A/B,输出错误信息 N。
第二列非数字,输出错误信息 M。
约束关系:
第一列A\B\“非AB”不可同时存在
第二列数字\非数字不可同时存在
3、绘制因果图并补充约束关系:
4、将因果图转化为判定表:列出所有可能的输入组合及其对应的输出结果
- 5、根据判定表设计测试用例:
测试用例ID | 输入(第一列, 第二列) | 预期输出 |
---|---|---|
Case1 | A, 5 | 修改文件 |
Case2 | A, X | 输出错误信息M |
Case3 | B, 5 | 修改文件 |
Case4 | B, X | 输出错误信息M |
Case5 | C, 5 | 输出错误信息N |
Case6 | C, X | 输出错误信息N和M |
因果图的分析中,可以进一步补充条件进行分析,如在Case1的基础上,再增加分析文件修改权限的讨论。
6.2 案例二:自助售货机系统
依据之前讲解的正交试验中的例子,分析自助售货机系统。假设完整的需求如下:
某自助售货机,支持自助售卖饮品,售卖的产品有怡宝、农夫山泉、脉动,售货机支持的支付方式需要有:支付宝、微信支付、数字货币、云闪付并且在交易时,并且支持人民币、美元支付。售卖机投放的区域有两块,区域A、区域B。售卖规则按所属区域自主调控定价。
完整区域定价表如下:
支付金额与出售价格一致时,可正常交易,会根据选择自动出货对应的饮品。支付金额与出售价格不一致时,会导致交易失败,此时不会出货。设计测试案例。
梳理需求,进行拆解得到下面的需求片段:
- 售卖机投放的区域有两块,区域A、区域B
- 售卖的产品有怡宝、农夫山泉、脉动
- 售货机支持的支付方式需要有:支付宝、微信支付、数字货币、云闪付
- 售货机支持支持人民币、美元支付
- 支付金额与出售价格一致时,可正常交易,会根据选择自动出货对应的饮品
- 支付金额与售出价格不一致时,会导致交易失败,此时不会出货。
- 售卖货品区域价格定价表
分析步骤如下:
1、确定输入和输出:
输入条件(原因):
序号 输入项 拆解子项 编号 1 “购买区域”输入 选择区域A购买;选择区域B购买 1、2 2 “购买产品选择”输入 选择怡宝购买;选择脉动购买;选择农夫山泉购买 3、4、5 3 “支付方式”输入 使用支付宝付款;使用微信付款;使用云闪付付款;使用数字货币付款 6、7、8、9 4 ”结算货币“输入 使用人民币结算;使用美金结算 10、11 5 “支付金额”输入 支付金额¥2;支付金额¥3;支付金额¥6;支付金额$0.3;支付金额$0.5;
支付金额$0.9;支付金额¥1.5;支付金额¥5;支付金额$0.4;支付金额$0.8;12、13、14、15、16
17、18、19、20、21输出结果:
序号 结果项 编号 1 购买成功,出货怡宝 91 2 购买成功,出货农夫山泉 92 3 购买成功,出货脉动 93 4 购买失败,不出货 94
2、中间节点:
序号 中间节点 编号 1 选择区域A或区域B 31 2 选择“怡宝”、“脉动”或“农夫山泉” 32 3 选择支付宝、微信、云闪付或数字货币付款 33 4 选择人民币或美金结算 34 5 选择区域A,确定支付方式使用人民币购买商品,开始交易 41 6 选择区域B,确定支付方式使用人民币购买商品,开始交易 42 7 选择区域A,确定支付方式使用美金购买商品,开始交易 43 8 选择区域B,确定支付方式使用美金购买商品,开始交易 44 9 支付¥2,付款成功 61 10 支付¥3,付款成功 62 11 支付¥6,付款成功 63 12 支付$0.3,付款成功 64 13 支付$0.5,付款成功 65 14 支付$0.9,付款成功 66 15 支付¥1.5,付款成功 67 16 支付¥5,付款成功 68 17 支付$0.4,付款成功 69 18 支付$0.8,付款成功 70 3、明确约束关系:
输入 约束条件 约束关系 “购买区域”输入 同一时刻仅可在1个区域购买 1、2互斥 “购买产品选择”输入 单次购买仅支持1款商品 3、4、5互斥 “支付方式”输入 单笔订单仅支持1种支付方式 6、7、8、9互斥 ”结算货币“输入 单笔订单仅支持1种结算货币 10、11互斥 “支付金额”输入 单笔订单仅显示1种价格 12~23互斥 3、绘制因果图:根据输入和输出以及它们之间的因果关系和约束条件,绘制完整因果图如下。
4、将因果图转换为判定表:部分判定表如下:
原始的因果图和完整判定表可以查收附件: 自动售货机-案例判定表.xlsx
- 5、设计测试用例:根据判定表直接转为测试用例,部分案例如下,逐个场景转换即可
测试用例ID | 输入(第一列, 第二列) | 预期输出 |
---|---|---|
C_1 | A区域, 购买怡宝,使用支付宝人民币结算,付款¥2 | 购买失败,不出货 |
C_2 | A区域, 购买怡宝,使用支付宝人民币结算,付款¥3 | 购买成功,出货怡宝 |
通过分析因果图,可以很完整的将所有测试情况考虑到,不用担心测试场景遗漏。
7、拓展:因果图与正交试验结合
在实际应用中,正交试验与因果图这两种方法是可以结合使用的,例如:先使用正交试验法对主要因素进行初步筛选和测试,确定一些关键的因素组合,然后针对这些关键组合,使用因果图法进行更详细的测试用例设计,以进一步提高测试的全面性和准确性,下面来介绍两种结合的策略。
7.1 策略一:基于因果图对正交试验结果进行补充逻辑验证
1、分析需求并构建因果图: 分析需求,得到输入和结果,绘制因果图并补充约束关系。
2、因素与水平的提取: 从因果图中选取独立”原因“作为正交试验的”因素“,将作为”因素“的每个可能取值,作为该”因素“的”水平“值。
3、选择正交表并生成测试用例组合: 根据获取的”因素“和”水平“选取合适的正交表进行试验分析,具体正交表的操作方法可以查看正交试验,得到正交表后,再通过正交表得到初步测试用例。
4、结合因果图逻辑进行验证与调整:
- 约束验证: 根据因果图中的约束条件(E、R约束等),验证正交表中的测试用例组合,剔除不符合实际业务的组合项。
- 关键路径补充: 分析并标记因果图中关键逻辑路径,检查是否被正交试验中的用例所覆盖,若存在遗漏,需补充相关场景,确保这些关键路径得到测试。
- 逻辑验证: 对于每一项正交表中的测试用例组合,通过因果图验证逻辑推断及其输出结果,得到最终测试用例。
7.2 策略二:基于因果图生成的判定表规则进行正交抽样
1、分析因果图生成完整的判定表: 先通过因果图分析,得到一个完整的判定表。
2、识别判定表中的条件项作为因素: 从判定表的输入条件,选取独立特性作为正交试验中的一个个“因素”,再根据输入条件的可能取值,将其作为对应因素的“水平”。
3、应用正交试验法选择规则子集: 根据得到的因素和水平值,生成合适的正交表。利用正交表结果,再反向从判定表的所有规则中,取出与正交表对应的所有取值相匹配的规则。
4、生成测试用例: 根据判定表中匹配的规则子集,设计具体的测试用例。
关于这两种策略,策略一更侧重于先从逻辑层面识别关键因素再进行组合优化,策略二则是在已形成完整逻辑规则集(判定表)的基础上进行高效抽样。实际应用中可根据具体情况灵活选择或结合使用。
9、参考
https://blog.csdn.net/onforget/article/details/137552880
https://www.cnblogs.com/yilang/p/12259420.html
https://test-method.tutorial.hogwarts.ceshiren.com/test_method/L1/tutorial/%E9%BB%91%E7%9B%92%E6%B5%8B%E8%AF%95%E6%96%B9%E6%B3%95%E8%AE%BA-%E5%88%A4%E5%AE%9A%E8%A1%A8/