等价类划分法和边界值法着重考虑输入条件,而不考虑输入条件的组合,决策表考虑了输入条件的组合情况,但没有考虑输入条件之间的相互制约的关系。
在查看程序规格说明时,如果发现输入之间有关系,相应会产生多个动作.需要考虑条件组合的情况,又发现条件之间存在相互制约,可以考虑使用因果图法。
因果图法概述
(1)因果图法相关概念
因果图法是一种适合于描述对于多种条件的组合、相应产生多个动作的形式的方法.对照规格说明书利用图解法分析输入条件的组合、约束关系和输出条件的因果关系,从而设计测试用例的方法,它适合于检查程序输入条件的各种组合情况。
因果图法从用自然语言书写的程序规格说明的描述中找出因(输入条件)和果(输出或程序状态的改变),因果图法最终生成的是决策表,再通过决策表设计测试用例。
(2)因果图的关系符号
因果图主要使用图解的方式来分析输入条件的组合以及与输出之间的关系,在处理关系的时候有特定的符号。



(3)因果图的约束符号
在软件测试中,如果程序有多个输入那么除了输入与输出之间的作用关系之外,这些输入之间往往也会存在某些依赖关系;
某些输入条件本身不能同时出现,某一种输入可能会影响其他输入,这些关系称之为”约束”。
例如某一软件用于统计体检信息,在输入个人信息时,性别只能输入男或女,这两种输入不能同时存在,而且如果输入性别为女,那么体检项就会受到限制。
约束符号只在输入与输入之间,或者输出与输出直接产生约束,一般用虚线连接,有特殊含义的用带箭头的虚线连接。
①E约束(Exclusive,异)∶a和b中最多只能有一个为1,即a和b不能同时为1。如下图所示。

②I约束(at least one,或)∶a、b和c中至少有一个必须是1,即a、b、c不能同时为0。
如图所示。

③O约束((one and only one,唯一)∶a和b有且仅有一个为1。
如图所示。

④ R约束(Requires,要求)∶a和b必须保持一致即a为1时,b也必须为1a为0时,b也必须为0,这里有了一个前后的制约关系故用了带箭头的虚线。
如图所示。

⑤M约束(Mask,强制)∶若结果a为1,则结果b必须为0。这是唯一的一个对输出的约束,前面的4个都是对输入的约束。
这里也有前后的关系,而且是输出的约束,故用带虚线的箭头并且箭头在右侧。如图所示。

(4)使用因果图设计测试用例的步骤
①分析软件规格说明描述中,哪些是原因(即输入条件或输入条件的等价类),哪些是结果(即输出条件)并给每个原因和结果赋予一个标识符。
②分析软件规格说明描述中的语义,找出原因与结果之间原因与原因之间对应的是什么关系?
根据这些关系,画出因果图。有些时候,原因和结果之间需要多步操作或组合,则可以添加中间节点,导出进一步的中间原因节点。
③由于语法或环境限制,有些原因与原因之间,原因与结果之间的组合情况不可能出现。
为表明这些特殊情况在因果图上用一些记号标明约束或限制条件。
④把因果图转换成决策表。转换时原因就是条件桩,结果就是动作桩。
中间节点也放到条件桩中,记录中间值,它既是上一步的结果,又是下一步的原因。
⑤把决策表表的每一列拿出来作为依据,设计测试用例。
3.4.2 因果图法测试用例设计举例
(1)实例1∶某软件对修改文件要求
现有一款软件,其规格说明书要求,要对文件进行修改,必须先输入特定符号,才能修改,否则给出相应提示。输入符号的要求如下∶输入的第一个字符必须是#或*,第二个字符必须是一个数字此情况下进行文件的修改;如果第一个字符不是#或*,则给出信息”类型错误”,如果第二个字符不是数字,则给出信息”序号错误”。
根据因果图测试用例设计步骤,设计如下。
①分析软件规格说明书,找出原因和结果。

②找出原因与结果之间的因果关系,原因与原因之间的约束关系,画出因果图。
把每个原因分别作为一个节点,从上到下放在左侧,每个结果也分别作为一个节点,从上到下放在右侧。
由于第一个字符是#或*,不确定,要与第二个字符进行判断,而且还与两种结果有关系,图画出来线非常多,非常乱。
仔细分析,其实最终的结果这是判断第一个字符和第二个字符,这里就可以先判断一下第一个字符的情况,得到一个中间节点,然后再与第二个字符一起判断。
这就是”或”节点或”与”节点相关的启发方法。因
果图如下图所示,节点m1就是中间节点。

③因为原因c;和c,不能同时成立,所以在因果图上要施加E约束。
④把因果图转换为决策表。根据因果图建立决策表,有三个条件,则有规则8条。
由于中间节点起到承上启下的作用,需要放到决策表中,有助于动作桩的具体结果的产生。
这里由于c;和c,具有E约束,不能同时成立,即不能同时取1所以决策表的第1列和第2列不可能存在,由此,动作桩中添加了”不可能”这一项,以此来体现E约束的作用。
在做测试用例的时候不用写,因为这是不可能存在的情况。
具体决策表如下:

另外,分析这个决策表,表面上看可以进行简化,但是由于第1列和第2列不存在,不写测试用例,不用再进一步简化。
再加上因为存在E 约束等情况其余情况也不能再一步进行简化,即上表可以作为最终的决策表了。
编写测试用例如下:

(2)实例2∶自动售货机
假设有一个处理单价为5角钱的饮料自动售货机,请完成其软件测试用例的设计。
其规格说明如下。
若投入5角钱或1元钱的硬币,按下“橙汁”或“啤酒”的按钮,则相应的饮料就送出来。若售货机没有零钱找,则显示“零钱找完”的红灯会亮,这时如果再投入1元硬币并按下按钮后,饮料不会送出来,同时1元硬币会退出来;若有零钱找,则显示“零钱找完”的红灯是不亮的,在送出饮料的同时退还5角硬币。
根据因果图测试用例设计步骤,设计如下。
①分析软件规格说明书,找出原因和结果。


②找出原因与结果之间的因果关系,原因与原因之间的约束关系,画出因果图。
如图下所示。

这里原因比较多,结果也比较多,而且互相之间都有关系,需要建立中间节点,表示处理中间状态,这里加了4个,具体如下。


④ 把因果图转换为决策表。根据因果图建立决策表,有5个条件,则有规则2^5=32条。
由于有E约束,动作桩中添加了”不可能”这一项,来体现E约束的作用,所以动作桩变成了6项。
具体见下表。


决策表中有E约束的情况,表格中会以灰色背景标识,最终结果都是不可能存在的情况。
得到初始决策表后.按照决策表步骤.下一步要进行简化。
上面决策表中有这样的几列没投入钱只按下了随意一款饮料或没按下任何饮料按钮,规格说明中没有任何结果,可以合并。
局部合并下如图所示。
另外由于表中有很多不可能出现的情况,可以把这些去掉后,让表的数据减少。

其实,有的读者可能发现,这个题目的规格说明其实不是很完善,如决策表中序号为24、20、8和4的这4列中,投了1元钱或5角钱后,没有进行任何的其他操作,按实际情况,应等待一定时间后(比如说30s)无操作,就应该退出相应的1元钱或5角钱。
再比如决策表中序号为18、17、2和1的这4列中,只是选了饮料,但没有投入钱币,等待一段时间后,应该提示投入钱币,如果超过一定时间不投入机器回归初始状态。
但是这个题目中没有任何说明,显然不合适。
建议读者试着添加需求后画出相应决策表。
⑤写出测试用例。根据决策表,去掉不可能的情况按照上图合并后,此自动饮料售货机的测试用例如下表所示。




1、恒等 有因就有果,没有因就没有果。
2、非 有因没有果,没有因有果。
3、或 条件有一个是真,结果就是真,条件都是假,结果才是假。
4、且(与) 条件都为真,结果才是真,一个条件为假,结果就是假。

利用因果图导出测试用例需要经过以下几个步骤∶
-①找出所有的原因,原因即输入条件或输入条件的等价类。
-②找出所有的结果,结果即输出条件。
-③明确所有输入条件之间的制约关系以及组合关系。
·哪些条件不能组合到一起,哪些条件可以组合到一起
④明确所有输出条件之间的制约关系以及组合关系。
·哪些输出结果不能同时输出,哪些输出结果可以同时输出
-⑤找出什么样的输入条件组合会产生哪种输出结果
-⑥把因果图转换成判定表/决策表。
-⑦ 为判定表/决策表中的每一列表示的情况设计测试用例。






发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213260.html原文链接:https://javaforall.net
