因果图思想的形成
在之前我介绍的等价划分方法和边界值分析方法,他们都是侧重于对单一的输入条件的分析,而事实上,对于一个程序,它的输入条件之间不会一直是相互独立的,多数情况下,这些输入条件会形成依赖,形成组合效应,相辅相成地影响程序的输出,因此,必须要有一种方法来描述输入(尤其是输入条件组合时)和输出之间的依赖关系,于是就形成了因果图思想。
因果图就是一种图形化工具,它描述输入条件的组合及其对应的输出。
输入条件的组合及其对应的输出,即输入条件以“与”,“或”,“非”的逻辑运算组合形式存在时,程序会产生什么样的运算结果,这就是我说的输入条件形成的组合效应,另外,可能一个输入条件和另一个输入条件之间会是互斥的、同一的的,这就是我说的输入条件之间形成的依赖关系,从形式上来看,因果图是一种形式语言,极其类似于组合逻辑网络。
我们不得不承认,因果图是一种系统的方法,这种方法是对规格说明的综合分析和考量,对测试开发人员有比较高的要求,用这种方法不仅能帮助我们设计出高效的测试用例,而且能帮助我们发现规格说明中不完整性和模糊性(不明确之处)。
运用因果图设计测试用例的过程
用该方法设计测试用例的一个的推荐过程:
- 分解:将规格说明分解为可执行的片段。这是出于把复杂问题简单化的考虑,使我们能更好地设计因果图,系统越复杂越是需要对其行为进行分解,比如一个管理路由器的web页面测试,我们可能只单独测试它的web登录页面,路由器管理页面的一个子菜单功能页面(比如拨号上网)。
- 提炼“因”和“果”并为其编号:从对规格说明的解读中确定因果关系,从而获得所有因和所有果。“因”是指一个明确的输入条件或输入条件的等价类,“果”是指一个输出条件或系统转化(输入对程序或系统状态的延续影响)。如ATM机,用户插入银行卡,银行卡磁条向下是一个输入条件,ATM机屏幕上显示登陆界面就是一个输出条件,即是插入的银行卡磁条朝下这一输入条件对ATM机系统的影响。
- 因果图:分析规格说明的语义内容,并将其转换为连接因果关系的布尔图。
- 注解:用以说明由于语法或环境的限制而不能联系起来的“因”和“果”。
- 有限项的判定表:我们需要仔细地跟踪因果图中的状态变化情况。
- 测试用例:基于判定表中的列逐个地生成测试用例。
构成因果图的基本符号及其运用
前面我们提到过因果图是极其类似于逻辑网络图的,那么下面我们就来看一下构成因果图的基本符号,假设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角 |
啤酒 |
灯亮,送出啤酒 |
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/82548.html