為什么么需要因果圖
在黑盒測試中,等價類划分或邊界值分析法只考慮了不同的輸入和不同的輸出之間的關系。但是如果是各個輸入條件之間有很復雜的組合,這二種設計方法都很難用一個系統的方法進行描述,設計測試用例只能依靠測試人員主觀的猜測或者分析,具有很大的盲目性。
讓我們先來看一個簡單的例子。
假設某個軟件需求文檔中有這樣的說明:
第一列字符必須是A或B,第二列字符必須是一個數字,在此情況下進行文件的修改。但如果第一列字符不正確,則給出信息L;如果第二列字符不是數字,則給出信息M。
先用等價類來分析,第一列會有三個輸入:A、B、非(A B)的字符。第二列字符有二個輸入:數字、非數字(為了簡便起見,有關數字再細化的問題不做討論)。這是一個根據理論進行分析的過程。但是做完了這一步,並不能得出輸出。也就是說如何分析第一列和第二列的關系,沒有明確的理論指導。實際操作過程中,各個測試人員可能會設計出不同的測試用例。
這個例子還僅僅是一個2個輸入條件之間有關系,如果到更復雜的應用中,可能會更多。如果沒有一種方法指導我們的思想,測試用例就會很不全面。
而因果圖正好彌補了上述缺點。我們先來看一下什么叫因果圖。因果圖是一種形式化的語言(以圖的形式表現),它不僅描述了原因和結果之間的關系,也描述了各個原因之間、各個結果之間復雜關系的組合。在這里,因就是程序的輸入條件,而果則是程序的輸出。正確的使用因果圖可以對很復雜的功能邏輯進行分析,設計出高效而簡潔的測試用例。
1.1. 因果圖概念介紹
學習因果圖需要的基本知識是:
1.1.1. 布爾邏輯運算符
三種常用的運算符是NOT、AND、OR。還有兩種比較少用的是NAND、NOR。再加上恆等,這六種符號是描述原因和結果之間的邏輯關系的。
下面以圖的形式詳細說明6種因果邏輯。c表示原因,e表示結果。
n 恆等:如果原因為真,那么結果必定為真。
<ignore_js_op>

n 與:只有2個原因都為真,那么結果為真。
<ignore_js_op>

n 或:2個原因中有一個為真時,結果就為真。
<ignore_js_op>

n 非:只有原因為假,結果才為真。
<ignore_js_op>

n 與非:先與后非。
<ignore_js_op>

n 或非:先或后非。
<ignore_js_op>

1.1.2. 因果圖的約束關系表示法
因果圖中有4種符號描述原因之間的約束關系,1種符號描述結果之間的約束關系。下面分別介紹:
n 排他性約束:各個原因之間不能同時為真,但可以同時為假。舉個例子,小明同學不可能同時屬於A班和B班,但可能既不是A班的,也不是B班的,而是C班的。
<ignore_js_op>

n 包含性約束:各個原因中總有一個為真。即可以同時為真,但不可以同時為假。舉個例子,支付寶買家付款時,有個輸入條件(既原因)是余額支付、網銀支付,買家可以選擇單獨余額支付或者單獨網銀支付,也可以同時選擇余額支付和網銀支付2種方式。但是不可以選擇不支付。
<ignore_js_op>

n 必要性約束:當原因a為真時,原因b必須同時為真;但是原因b為真時,原因a既可以為真,也可以為假。舉數字證書的例子:現有的業務規則下,如果申請了數字證書(原因a),那么該用戶必然通過了支付寶認證(原因b)。反之,如果用戶通過了支付寶認證,那么不一定申請了數字證書(a)。
<ignore_js_op>

n 唯一性約束:有且只有原因a和原因b中的一個為真。非此即彼,不存在第三種情況。舉例來說,人的性別不是男,就是女,不會存在既不是男也不是女的人。
<ignore_js_op>

n 掩碼標記(結果約束):如果結果b為真,那么結果a一定為假,如果結果b為假,則結果a的狀態不定。還拿支付寶來舉例子,先給出兩個結果:安全控件運行正常(a),無法輸入登陸密碼(b)。如果無法輸入登陸密碼,那么可以判斷是安全控件沒有正常運行,反過來,如果可以輸入登陸密碼,則不能確定安全控件一定工作正常,有可能是用了FireFox瀏覽器訪問Alipay的。
<ignore_js_op>

http://www.bcbxhome.com/bcbx/forum.php?mod=viewthread&tid=26&fromuid=27
(出處: 編測編學軟件測試)