因果图法就是从程序规格说明书的描述中找出因(输入条件)和果(输出或程序状态的改变),通过因果图转换为判定表,最后为判定表中的每一列设计一个测试用例。
首先我们来了解一下因果图的基本符号:
三种常用的运算符是NOT、AND、OR。还有两种比较少用的是NAND、NOR。再加上恒等,这六种符号是描述原因和结果之间的逻辑关系的。
下面以图的形式详细说明6种因果逻辑。c表示原因,e表示结果。
n 恒等:如果原因为真,那么结果必定为真。
n 与:只有2个原因都为真,那么结果为真。
n 或:2个原因中有一个为真时,结果就为真。
n 非:只有原因为假,结果才为真。
n 与非:先与后非。
n 或非:先或后非。
2. 应用的范围
更复杂的条件组合,2^n,n比较多的时候
3. 步骤
1)根据程序规格说明书描述的语义内容,分析并确定“因”和“果”;
2)将“因”和“果”表示成 “因果图”;
3)在因果图上使用若干个约束符号来标明约束条件;
4)将得到的因果图转换成判定表;
5)为判定表中每一列所表示的情况设计一个测试用例。
4. 案例
以中国象棋中马的走法为例子,具体说明:
1、如果落点在棋盘外,则不移动棋子;
2、如果落点与起点不构成日字型,则不移动棋子;
3、如果落点处有自己方棋子,则不移动棋子;
4、如果在落点方向的邻近交叉点有棋子(绊马腿),则不移动棋子;
5、如果不属于1-4条,且落点处无棋子,则移动棋子;
6、如果不属于1-4条,且落点处为对方棋子 (非老将) ,则移动棋子并除去对方棋子;
7、如果不属于1-4条,且落点处为对方老将,则移动棋子,并提示战胜对方,游戏结束。
案例分析--因果图
1)根据程序规格说明书描述的语义内容,分析并确定“因”和“果”;
原因:
1、落点在棋盘外;
2、不构成日字;
3、落点有自方棋子;
4、绊马腿;
5、落点无棋子;
6、落点为对方棋子;
7、落点为对方老将。
结果:
21、不移动;
22、移动;
23、移动己方棋子消除对方棋子;
24、移动并战胜对方。
2)将“因”和“果”表示成 “因果图”,并标明约束条件;
3)将得到的因果图转换成判定表;
11这个结点称做中间结点,是为了让因果图的结构更加明了,简化因果图导出的判定表。分析得出以下两个结论:
只有1、2、3、4都不成立时,产生11,跟5、6、7结合分别得出22、23、24三个结果;
不管5、6、7哪个成立,只要1、2、3、4有一个成立,就产生结果21;再加上落点有自方棋子的状况。
可以得到判定表如下:
进一步分析,将各种不可能产生的组合情况,取消掉,图中用灰色表示。这些都是之前没有写的一些约束条件导致的。比如落点在棋盘外,那么落点就不可能在对方棋子上了。
4)为判定表中每一列所表示的情况设计一个测试用例。
5. 总结
因果图常和判定表结合起来使用,先用因果图后用判定表。
例子2
再以支付宝认证总流程为例,说明因果图的实际应用。
支付宝个人认证中,分为两部分:个人身份认证和银行卡认证。这两者都通过后,认为个人认证成功。
个人身份认证需要提交个人基本信息及身份证复印件。
银行卡认证分为两种:提现认证和充值认证。
提现认证的流程是:用户提交正确的银行帐号——>支付宝给用户的银行卡中随机打款——>用户确认金额,认证成功。
充值认证的流程是:用户提交正确的银行帐号——>充值——>充值完成——>网银反馈,认证成功。
n 从上面的描述中,我们可以总结出2大原因和一个结果。
原因一:身份认证成功
身份认证成功也是一个中间结果,它也有2个原因,提交基本信息成功和提交身份证成功。
原因二:银行卡认证成功,包含2个原因:充值认证成功和提现认证成功。这2种原因也可以看做是中间结果,产生结果的原因在需求中可以也能明显看出来,不再赘述。
一个结果:个人认证成功。
注意:为了简便起见,我们假设个人信息提交和身份证件提交成功后,身份认证则成功,忽略人工审核过程。
原因和结果表如下:
原因 | c11 | 个人基本信息提交成功 |
c12 | 个人身份证件提交成功 | |
原因 | c221 | 充值认证的银行帐号提交成功 |
c222 | 充值成功 | |
c223 | 网银反馈成功 | |
原因 | c211 | 提现认证的银行帐号提交成功 |
c212 | 支付宝打款成功 | |
c213 | 用户确认成功 | |
中间结果 | c21 | 银行卡提现认证成功 |
c22 | 银行卡充值认证成功 | |
中间结果 | c1 | 身份认证成功 |
c2 | 银行卡认证成功 | |
结果 | e1 | 个人认证成功 |
n 确定因果逻辑关系
对于因果关系较为的复杂的逻辑,通过结果向前推原因是一个不错的方法。
认证成功:身份认证成功和银行卡认证同时为真,认证成功才为真。
身份认证成功:基本信息和身份证件同时为真,身份认证成功才为真。
银行卡认证:提现认证和充值认证有一个成功,银行卡认证则成功。
提现认证、充值认证都是所有的原因都为真时,自己才为真。
n 确定约束关系
从业务流程可知:提现认证和充值认证是二择一的,满足唯一性约束条件。而充值认证的三个原因,有流程上的先后顺序,满足必要性约束条件。同样,提现认证的三个原因也满足必要性约束条件。
根据约束关系,我们画出因果图如下:
n 画决策表及设计测试用例的过程略。
总上所述,我认为因果图最大的好处有2点:
n 考虑了多个输入之间的相互组合、相互制约关系。
n 帮助我们按一定步骤,高效率地选择测试用例。