因果图(Cause-EffectGraphing)提供了一个把规则转化为判定表的系统化方法,从该图中可以产生测试数据。其中,原因是表示输入条件,结果是对输入执行的一系列计算后得到的输出
因果图方法最终生成的就是判定表。它适合于检查软件输入条件的各种组合情况
一、 因果逻辑关系
因果逻辑关系主要分成三大类:
- 第一类:因果关系(输入和输出之间的逻辑关系)
a)恒等:假设输入为a,输出为b;满足条件a则输出结果b
b)非:假设输入条件为a,输出为b;满足条件a则不能输出结果b
c)或:多个条件只要满足其一就可以得到某个结果;
d)与:多个条件同事满足才能得到某个结果; - 第二类: 原因之间的关系(输入和输入之间的制约关系)
a)异(Exclusive):多个输入至多只能一个为真,不可以同时都为真,可以同时都不为真
b)或(Inclusive):多个输入条件至少有一个为真,可以同时为真,不可以同时不为真
c)唯一(Only):多个输入条件有且只能有一个为真,不可以同时都为真,也不可以同时都不为真
d)要求(Require):有两个输入a和b,a为真则要求b为真;a为假则对b不做要求 - 早教机构:小朋友a;父母b
小朋友到早教机构上课,则要求父母陪护;
小朋友不到早教机构上课,父母可以来参观也可以不来 - 第三类: 结果之间的关系(输出和输出之间的制约关系)
a)强制:输出a和b,如果a为真则强制b为假;a为假对b不做强制
二、 因果图的运用
例1: 手机欠费或者停机则不能主被叫
原因:
C1 欠费
C2 停机
结果:
Ef1 不能主被叫
例2: 有一个需求描述如下:对已运行10年以上的机器、或功率大于50马力且维修记录不全的机器,给予全面维修处理,对其它机器进行一般维修处理
原因:
C1 运行10年以上
C2 功率大于50马力
C3 维修记录不全
结果:
Ef1 全面维修处理
Ef1 一般维修处理
Cm2:中间节点
中间节点:
(1)当多个原因之间不是单纯的与或的关系,我们可以利用中间节点存取中间结果,使得我们的因果逻辑关系看上去更清晰;
(2)当多个原因都在描述同一件事情时,我们可以利用中间节点归并逻辑。例3: 修改账户密码,要求如下:首选输入正确的原始密码;输入两次一致的新密码;并且新密码要具有
一定的复杂度(8-15位;包含大写字符;小写字母;数字;其它字符)
假定:优先提醒原始密码不正确,然后提醒新密码不一致,最后提醒新密码不够复杂
原因:
C1 原始密码正确
C2 新密码一致
C3 新密码够复杂度
结果:
Ef1 修改成功
例4: 文件修改需求:
如想对文件进行修改,需要遵循以下规则:
输入的第一列字符必须是A或B;第二列字符必须是一个数字;
如果第一列字符不正确,则给出信息L;如果第二列字符不正确,则给出信息M;如果两列字符输入正确,则可修改文件
原因:
C1 第一列为A
C2 第一列为B
C3 第二列为数字(0~9)
结果:
Ef1 信息L
Ef2 信息M
Ef3 修改文件
根据因果图生成判定表:
例5: 有一个处理单价为5角钱盒装饮料的自动售货机软件。若投5角硬币,按下“可乐”、“雪碧”、或“红茶”按钮,相应的饮料就送出来。若投入1元硬币并按下按钮后,送出饮料的同时退还5角硬币。
原因:
C1 投入5角硬币
C2 投入1元硬币
C3 按下“可乐”按钮
C4 按下“雪碧”按钮
C5 按下“红茶”按钮
结果:
Ef1 退还5角硬币
Ef2 送出“可乐”饮料
Ef3 送出“雪碧”饮料
Ef4 送出“红茶”饮料
原因→原因之间的关系:
C1 与 C2 是E的关系; C3、C4、C5 是E的关系。
结果→结果之间的关系:
Ef2与Ef3与Ef4是M的关系。
三、 因果图法设计用例的步骤
- 把大的系统规格划分解成可以测试的规格片段
- 分析分解后待测的系统规格,找出哪些是原因,哪些是结果
- 画出因果图
- 把因果图转换成判定表
- 简化判定表
- 用判定表中的每一项生成测试用例
四、 因果图的特点与应用
优点:
- 等价类法尽管格格输入条件可能出错的情况都考虑到了,但是多个输入条件组合起来出错的情况却被忽略了
- 因果图法能够帮助我们按照一定步骤,高效的选择测试用例,设计多个输入条件组合用例
- 因果图分析还能为我们指出,程序规格说明描述中存在什么问题
缺点:
- 输入条件与输出结果的因果关系,有时难以从软件需求规格说明书得到
- 即使得到了这些因果关系,也会因为因果关系复杂导致因果图非常庞大哦,测试用例数目极其庞大