因果图(Cause-Effect Graph)是用于描述系统的输入、输出以及输入和输出之间的因果关系、 输入和输入之间的约束关系。因果图的绘制过程是对被测试系统外部特征的建模过程。在实际测试过程中,因果图和判定表两种方法往往同时使用,根据系统输入和输出间的因果图可以得到判定表, 根据判定表产生设计测试用例。 因果图需要描述输入与输出之间的因果关系和输入与输入之间的约束关系。 表示输入与输出间的因果关系有以下四种: (1)恒等关系:当输入项发生,会产生对应输出;当输入项不发生时,不会产生对应输出。 (2)非关系:与恒等关系相反。 (3)或关系:多个输入条件中,只要有一个发生,则会产生对应输出。 (4)与关系:多个输入条件中,只有所有输入项都发生,才会产生对应输出。
表示输入与输入间的约束关系也有以下四种: (1)异:所有输入中至多一个输入条件发生。 (2)或:所有输入中至少一个输入条件发生。 (3)唯一:所有输入中有且只有一个输入条件发生。 (4)要求:所有输入中只要有一个输入条件发生,则其他输入也会发生。 该四种约束关系对应的因果图表示方法如图 8-12 所示。 因果图法设计用例的步骤如下: (1)把大的系统规格分解成可以测试的规格片段。 (2)分析分解后待测的系统规格,找出哪些是原因,哪些是结果。 (3)画出因果图。 (4)把因果图转换成判定表。 (5)简化判定表。 (6)用判定表中的每一项生成测试用例。
【实例】使用因果图分析法对中国象棋中的走马规则进行测试。 步骤 1:分析中国象棋中的走马规则,中国象棋中走马规则的描述如下: (1)如果落点在棋盘外,则不移动棋子。 (2)如果落点与起点不构成“日”字型,则不移动棋子。 (3)如果落点处有己方棋子,则不移动棋子。 (4)如果在落点方向的邻近交叉点有棋子(绊马腿),则不移动棋子。 (5)如果不属于 1~4 条,且落点处无棋子,则移动棋子。 (6)如果不属于 1~4 条,且落点处为对方棋子(非老将),则移动棋子并除去对方棋子。 (7)如果不属于 1~4 条,且落点处为对方老将,则移动棋子,并提示战胜对方,游戏结束。 步骤 2:分析以上要求,得出原因和结果。 (1)原因: 原因 1:落点方向的邻近交叉点无棋子。 原因 2:落点与起点构成“日”字。 原因 3:落点处有己方棋子。 原因 4:落点在棋盘外。 原因 5:落点处无棋子。 原因 6:落点处为对方棋子(非老将)。 原因 7:落点处为对方棋子(老将)。 (2)中间结点: 中间结点 11:允许移动。 (3)结果: 结果 21:不移动棋子。 结果 22:移动棋子。结果 23:移动棋子,并除去对方棋子。 结果 24:移动棋子,并提示战胜对方,结束游戏。 步骤 3:根据原因和结果画出因果图。
接下来的步骤是将因果图转化为判定表,并根据判定表来完成测试用例。关于判定表分析方法。 使用因果图法设计测试用例有以下优点: (1)尽管等价类法将各个输入条件可能出错的情况都考虑到了,但是多个输入条件组合起来 出错的情况却被忽略了,因果图分析法则可以考虑多输入条件组合的情况。 (2)因果图法能够帮助我们按照一定步骤高效地选择测试用例,设计多个输入条件组合用例。 (3)因果图分析还能为我们指出程序规格说明描述中存在的问题。 因果图分析法存在优点但也存在以下缺点: (1)输入条件与输出结果的因果关系,有时难以从软件需求规格说明书得到。 (2)即使得到了这些因果关系,也会因为因果关系复杂导致因果图非常庞大,测试用例数目 极其庞大。