因果圖法(魚骨圖 / Cause-and-Effect Diagram)

Edited by Chloe, Esther, May (以字母排序)

如果在測試時必須考慮輸入的各種組合,與各個輸入情況之間相互制約的關係,有可能產生出來的組合總數非常大,將所有組合測試過並得到其結果會花費很多時間,這並不是有效率的測試策略,我們不可能將全部組合都測試過。

輸入條件的各種組合,都會有其結果,得到結果之後要執行相對應的動作。窮舉所有組合之後得到的結果雖然有很多種,但可能還是會有重複的。若能針對同樣結果的組合只挑其一來測試,則能有效減少重複結果的測試組合。

透過「因果圖」可以達成上述的目的,因果圖是一種用於描述多種輸入條件組合,根據輸入條件的組合、約束關係和輸出條件的因果關係,分析輸入條件的各種組合情況,進而設計測試案例的方法。

因果圖(Cause-and-Effect Diagram)

因果圖是從需求規格書的描述中,找出「因」作為輸入條件,「果」作為輸出或程式狀態的改變,再透過因果圖轉換為判斷表。

因果圖又可稱為「魚骨圖」(Fishbone Diagram),因為魚骨圖的魚頭通常表示某一特定結果(或問題),而組成此魚身的大骨,即是造成此結果之主要原因。

正交試驗設計-魚骨圖

*透過因果圖導出測試案例的步驟如下:

<

p style="padding-left:30px;">1. 分析規格說明書,哪些是「原因」,哪些是「結果」。原因常常是輸入條件或是輸入條件的等價類,而結果通常為輸出條件。
2. 分析規格說明書中語義的內容,並將每個「原因」與「結果」給予一個符號,然後將其表示成連接這個「原因」與「各個結果」的「因果圖」。
3. 表明約束條件。由於一些限制(如:語法或是環境),有些「原因」和「結果」的組合情況是不可能出現的,為表明這些狀況,在因果圖上會使用若干個標準符號標明約束條件。
4. 將「因果圖」轉換成「判斷表」
5. 根據「判斷表」中的每一列,設計測試案例

判斷表(判定表)

用因果圖方法產生的測試案例,包括所有輸入資料取「True」和「False」的情況,可以讓測試案例的數目減少,且測試案例數目可以隨著輸入資料增加而增加的情況。

*判斷表為一個表格,分為以下四個部分:

<

p style="padding-left:30px;">1. 條件樁(Condition Stub):條件的名稱,列出了問題的所有條件。
2. 動作樁(Action Stub):處理中的活動名稱,列出了問題規定可能採取的操作。
3. 條件項(Condition Entry):所有條件的組合,列出針對它左列條件的取值,在所有可能情況下的真假值。
4. 動作項(Action Entry):列出在條件項的各種取值情況下應該採取的動作。

因果圖法 - 判斷表

*判斷表的建立步驟:

<

p style="padding-left:30px;">1. 確認規則的個數,假設有 N 個條件的話,每個條件有兩個取值(True,False),所以有 2^N 種規則。
2. 列出所有的條件樁(Condition Stub)和動作樁(Action Stub)。
3. 填入條件項。
4. 填入動作項,製定初始判定表。
5. 簡化:合併相似規則或相同動作。

案例:會員的集點卡

某家公司的會員有分 VIP 會員及普通會員,普通會員及 VIP 會員優惠如下:

<

p style="padding-left:30px;">(一)普通會員只要累積消費金額達到 5000 元即可升級至 VIP 會員。
(二)當 VIP 會員集滿 10 點,即會自動扣除,並折抵 20 元。
(三)當普通會員集滿 10 點,即會自動扣除,並折抵 10 元。

因果圖法 - 案例 (因果圖)

條件樁:是否滿十點、是否為 VIP 會員、是否累積消費金額滿 5000 元
動作樁:直接升級為 VIP、直接扣除 10 點折抵 20 元、直接扣除 10 點折抵 10 元

得到的初始判定表為以下:

因果圖法 - 案例 初始判定表

將初始判定表簡化(合併相同動作)後為以下:

因果圖法 - 案例 簡化判定表

由以上例子可以得見,原本要用 8 個 test cases 才能測到所有情況,但我們可以將結果相同的當做是同一類,僅選取一組來做。如此一來,原本 8 個 test cases 篩選過後就變成 5 個 test cases 而已,測試組合減少了,我們也可以測試每種結果的組合至少一次,達到測試效果,提升測試效率。

*參考網址:
(1) 魚骨圖、因果圖與問題解決思考流程
(2) 魚骨圖(Cause & Effect/Fishbone Diagram)
(3) 因果圖法(百度)
(4) 判斷表(百度)
(5) TestingProject_ch4 測試設計 p4-14 頁

對「因果圖法(魚骨圖 / Cause-and-Effect Diagram)」的一則回應

發表留言