1. 程式人生 > >[轉摘]測試用例設計—因果圖法

[轉摘]測試用例設計—因果圖法

1.引言

等價類劃分方法和邊界值分析方法,都是著重考慮輸入條件,但未考慮輸入條件之間的聯絡、相互組合等。考慮輸入條件之間的相互組合,可能會產生一些新的情況。但要檢查輸入條件的組合不是一件容易的事情,即使把所有輸入條件劃分成等價類,他們之間的組合情況也相當多。因此必須考慮採用一種適合於描述對於多種條件的組合,相應產生多個動作的形式來考慮設計測試用例。這就需要利用因果圖(邏輯模型)。
因果圖(Cause-EffectGraphing)提供了一個把規格轉化為判定表的系統化方法,從該圖中可以產生測試資料。其中原因是表示輸入條件,結果是對輸入執行的一系列計算後得到的輸出。
因果圖方法最終生成的就是判定表,它適合於檢查程式輸入條件的各種組合情況。

2.因果圖介紹

2.1圖例說明

1、
4種符號分別表示了規格說明中向4種因果關係。如圖2-1所示。


圖2-1 因果圖關係

2、
因果圖中使用了簡單的邏輯符號,以直線聯接左右結點。左結點表示輸入狀態(或稱原因),右結點表示輸出狀態(或稱結果)。
3、ci表示原因,通常置於圖的左部;ei表示結果,通常在圖的右部。ci和ei均可取值0或1,0表示某狀態不出現,1表示某狀態出現。

2.2因果圖概念

1、關係
(圖2-1 因果圖關係)
①恆等:若ci是1,則ei也是1;否則ei為0。
②非:若ci是1,則ei是0;否則ei是1。
③或:若c1或c2或c3是1,則ei是1;否則ei為0。“或”可有任意個輸入。
④與:若c1和c2都是1,則ei為1;否則ei為0。“與”也可有任意個輸入。

2、約束

輸入狀態相互之間還可能存在某些依賴關係,稱為約束。例如,某些輸入條件本身不可能同時出現。輸出狀態之間也往往存在約束。在因果圖中,用特定的符號標明這些約束。如圖2-2所示。



圖2-2因果圖約束

A.輸入條件的約束有以下4類:
① E約束(異):a和b中至多有一個可能為1,即a和b不能同時為1。
② I約束(或):a、b和c中至少有一個必須是1,即 a、b 和c不能同時為0。
③ O約束(唯一);a和b必須有一個,且僅有1個為1。
④R約束(要求):a是1時,b必須是1,即不可能a是1時b是0。

B.輸出條件約束型別
輸出條件的約束只有M約束(強制):若結果a是1,則結果b強制為0。

2.3因果圖法設計測試用例
步驟

1、分析待測得系統規格,找出原因與結果
分析軟體規格說明描述中,那些是原因(即輸入條件或輸入條件的等價類),那些是結果(即輸出條件), 並給每個原因和結果賦予一個識別符號。
2、畫出因果圖
分析軟體規格說明描述中的語義。找出原因與結果之間,原因與原因之間對應的關係。根據這些關係,畫出因果圖。
3、標記約束或限制條件
由於語法或環境限制,有些原因與原因之間,原因與結果之間的組合情況下不可能出現。 為表明這些特殊情況,在因果圖上用一些記號表明約束或限制條件。
4、把因果圖轉換為判定表。
5、用判定表中的每一項生成測試用例。

3.因果圖例項

3.1例項一

某軟體規格說明書包含這樣的要求:第一列字元必須是A或B,第二列字元必須是一個數字,在此情況下進行檔案的修改,但如果第一列字元不正確,則給出資訊L;如果第二列字元不是數字,則給出資訊M。

1、對說明進行分析,得到原因和結果:

原因:
1:第一列字元是A;
2:第一列字元是B;
3:第二列字元是一數字。

結果:
21:修改檔案;
22:給出資訊L;
23:給出資訊M。

2、其對應的因果圖如下:11為中間節點;考慮到原因1和原因2不可能同時為1,因此在因果圖上施加E約束,如圖3-1所示。



圖3-1例項一的因果圖

3、根據因果圖建立判定表。



表中8種情況的左面兩列情況中,原因①和原因②同時為1,這是不可能出現的,故應排除這兩種情況。

4、把判定表的每一列拿出來作為依據,設計測試用例
我們把表的最下一欄給出了6種情況的測試用例,這是我們所需要的資料。

3.2例項二

有一個處理單價為5角錢的飲料的自動售貨機軟體測試用例的設計。
其規格說明如下:
若投入5角錢或1元錢的硬幣,押下〖橙汁〗或〖啤酒〗的按鈕,則相應的飲料就送出來。
若售貨機沒有零錢找,則一個顯示〖零錢找完〗的紅燈亮,這時在投入1元硬幣並押下按鈕後,飲料不送出來而且1元硬幣也退出來;
若有零錢找,則顯示〖零錢找完〗的紅燈滅,在送出飲料的同時退還5角硬幣。

1、分析這一段說明,列出原因和結果:
這本身只是一個例項,只是用來學習,其實其設計說明還是存在好多漏洞的,例如:如果售貨機裡沒有飲料了怎麼辦?

原因:
1、售貨機有零錢找
2、投入1元硬幣
3、投入5角硬幣
4、押下橙汁按鈕
5、押下啤酒按鈕

結果:
21、售貨機〖零錢找完〗燈亮
22、退還1元硬幣
23、退還5角硬幣
24、送出橙汁飲料
25、送出啤酒飲料

2、畫出因果圖,如圖3-2所示。
所有原因結點列在左邊,所有結果結點列在右邊。建立中間結點,表示處理的中間狀態。中間結點:
11、投入1元硬幣且押下飲料按鈕
12、押下〖橙汁〗或〖啤酒〗的按鈕
13、應當找5角零錢並且售貨機有零錢找
14、錢已付清



圖3-2 售貨機因果圖

3、轉換成判定表:


4、在判定表中,陰影部分表示因違反約束條件的不可能出現的情況,刪去。第16列與第32列因什麼動作也沒做,也刪去。最後可根據剩下的16列作為確定測試用例的依據。

3.3例項三

NextData函式的精簡決策表
M1={月份: 每月有30天}
M2={月份: 每月有31天, 12月除外}
M3={月份: 2月}
M4={月份:12月}
D1={日期:1<=日期<=27}
D2={日期:28}
D3={日期:29}
D4={日期:30}
D5={日期:31}
Y1 ={年:年是閏年}
Y2 ={年:年不是閏年}
輸入變數間存在大量邏輯關係的NextData決策表。

分析這一段說明,列出原因(條件)和結果:

原因(條件):
M1={月份: 每月有30天}
M2={月份: 每月有31天, 12月除外}
M3={月份: 2月}
M4={月份:12月}
D1={日期:1<=日期<=27}
D2={日期:28}
D3={日期:29}
D4={日期:30}
D5={日期:31}
Y1 ={年:年是閏年}
Y2 ={年:年不是閏年}

結果:
輸入的日期無效,例如:2008-4-30;2007-2-29;2008-2-30;2008-2-31;
日前為1;
月份為1;
日期+1;
月份+1;
年份+1;



該圖沒有考慮無效日期的情況。

輸入條件過於龐大,個人覺得將其分成4部分利於編寫判定表,每個Mi對應一張表。這裡就不過多描述了。
這裡大家可以嘗試用正交試驗法解決。

3.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、根據分析出來的原因和結果,我們可以畫出因果圖,如下:



11這個結點稱做中間結點,是為了讓因果圖的結構更加明瞭,簡化因果圖匯出的判定表。
組合過於龐大(2的7次方)通過中間結點11,將判定表分成兩部分,簡化判定表如下:


將無用的組合去掉。

將上面兩張表根據潛在的約束條件,再次修整,得到如下圖:

4.因果圖法優缺點

4.1優點
1、因果圖法能夠幫助我們按照一定步驟,高效的選擇測試用例,設計多個輸入條件組合用例
2、因果圖分析還能為我們指出,軟體規格說明描述中存在的問題

4.2缺點

1、輸入條件與輸出結果的因果關係,有時難以從軟體需求規格說明書得到。
2、即時得到了這些因果關係,也會因為因果關係複雜導致因果圖非常龐大,測試用例數目及其龐大。