測試策略
一組合理的策略如下:
- 如果規(guī)格說明包含輸入條件組合的情況,應(yīng)首先使用因果圖分析法。
- 任何情況下都應(yīng)使用邊界值分析法。邊界值分析法可以產(chǎn)生一系列補(bǔ)充的測試條件,多數(shù)甚至全部條件可以被整合到因果圖分析中。
- 為輸入和輸出確定有效和無效等價類,在必要情況下對上面確認(rèn)的測試用例進(jìn)行補(bǔ)充。
- 使用錯誤猜測增加更多的測試用例。
- 針對上述測試用例,檢查程序的邏輯結(jié)構(gòu)。如果覆蓋準(zhǔn)則未能被前四個步驟中確定的測試用例所滿足,并且滿足準(zhǔn)則也并非不可能,那么增加足夠數(shù)量的測試用例,以使覆蓋準(zhǔn)則得到滿足。
再一次聲明,使用上述策略并不能保證可以發(fā)現(xiàn)所有的錯誤。但實(shí)踐證明這是一個合理折中的方案。同時,它也代表了客觀的艱巨工作量,雖然沒人說軟件測試是一件容易的事。
一、等價類劃分
確定等價類
有效等價類代表對程序的有效輸入;無效等價類代表的是其他不正確的任何輸入。如果需要,我們還可以將一個等價類劃分為更小的一些等價類。
書籍?dāng)?shù)量

書籍類型

生成測試用例
- 為每個等價類設(shè)置編號。
| 輸入條件 | 有效等價類 | 無效等價類 |
|---|---|---|
| 書籍?dāng)?shù)量 | ①1≤X≤99 | ②X<1③X>99 |
| 書籍類型 | ④硬皮⑤軟皮⑥活頁 | ⑦其他 |
- 編寫測試用例,盡可能多的覆蓋尚未被覆蓋的有效等價類。直到所有的有效等價類都被測試用例覆蓋。
| 編號 | 用例 | 覆蓋等價類 |
|---|---|---|
| 1 | 50,硬皮 | 覆蓋①④ |
| 2 | 50,軟皮 | 覆蓋①⑤ |
| 3 | 50,活頁 | 覆蓋①⑥ |
- 編寫測試用例,覆蓋一個且僅一個尚未被覆蓋的無效等價類。直到所有的無效等價類都被測試用例所覆蓋。
| 編號 | 用例 | 覆蓋無效等價類 |
|---|---|---|
| 4 | -50,硬皮 | 覆蓋② |
| 5 | 199,軟皮 | 覆蓋③ |
| 6 | 50,線裝 | 覆蓋⑦ |
用單個的測試用例覆蓋無效等價類,是因?yàn)橛行┹斎氲腻e誤檢查可能會屏蔽或取代其他輸入的錯誤檢查。比如②⑦,也許程序提示“非法的書籍?dāng)?shù)量”后,就不會執(zhí)行對書籍類型的檢查了。
二、邊界值分析
所謂邊界條件,是指輸入和輸出等價類中恰好處在邊界、或超過邊界、或在邊界以下的狀態(tài)??紤]了邊界條件的測試用例具有更高的測試回報率。
上例中的書籍?dāng)?shù)量范圍是1~99,所以針對0,1和99,100的情況分別設(shè)計測試用例。

從定義可以看出,等價劃分只關(guān)注輸入空間(輸入等價類)的不同,邊界值分析還需要從輸出空間(輸出等價類)設(shè)計測試用例。
例,某個程序按月計算個人所得稅的速算扣除數(shù),且最小金額是0,最大金額是13,505。使用邊界值分析法,應(yīng)該設(shè)計測試用例測試速算扣除數(shù)結(jié)果為0和13505的情況。此外,還應(yīng)觀察是否可能設(shè)計出導(dǎo)致速算扣除數(shù)為負(fù)數(shù),或者超過13505的測試用例。

邊界值分析法和等價劃分重要的區(qū)別是,等價劃分是從等價類中挑選任意一個元素作為測試數(shù)據(jù);邊界值分析法考察正處于等價劃分邊界或在邊界附近的狀態(tài)。
三、因果圖
邊界值分析和等價劃分的缺點(diǎn)是,未對輸入條件的組合情況、輸入條件之間的相互制約關(guān)系進(jìn)行分析。
因果圖的基本關(guān)系
- 恒等(Identify):若a為1,則b為1;否則b為0。
- 非(NOT):若a為1,則b為0;否則b為1。
- 或(OR):若a或b或c為1,則d為1;否則d為0。
- 與(AND):若a和b和c都為1,則d為1;否則d為0。

因果圖的約束條件
1、對于輸入條件的約束有E、I、O、R四種:
- 異(E):E必須總為真,而a、b最多只有一個為1。
- 或(I):I為真時,a、b和c中至少有一個必須為1。
- 唯一(O):a、b中,有且僅有一個必須為1。
- 要求(R):如果a為1,b也必須為1。

2、對于輸出結(jié)果的約束只有M一種:
屏蔽(M):如果結(jié)果a為0,則b強(qiáng)制為0。

一、假設(shè)有一規(guī)格說明:“第一列中的字符必須是‘A’或‘B’,第二列中的字符必須是一個數(shù)字。在這種情況下,對文件進(jìn)行更新。如果第一個字符不正確,產(chǎn)生提示信息X12。如果第二個字符不是數(shù)字,產(chǎn)生提示信息X13?!?/p>
(1)將規(guī)格說明分解為可執(zhí)行的片段,確定“因”和“果”,為每個“因”和“果”都賦予唯一的編號?!耙颉笔菞l件,是指一個明確的輸入條件等價類?!肮笔莿幼鳎侵敢粋€輸出或系統(tǒng)轉(zhuǎn)換(輸入對程序或系統(tǒng)狀態(tài)的延續(xù)影響)。
| “因” | “果” |
|---|---|
| 1 —— 第一列的字符是“A” | 70 —— 對文件做了更新 |
| 2 —— 第一列的字符是“B” | 71 —— 產(chǎn)生提示信息X12 |
| 3 —— 第二列的字符是一個數(shù)字 | 72 —— 產(chǎn)生提示信息X13 |
(2)分析規(guī)格說明的語義,轉(zhuǎn)換為因果圖。原因①和原因②不可能同時成立,為因果圖添加對應(yīng)的約束條件,得到右圖。

(3)將因果圖轉(zhuǎn)換為判定表,每一列代表一個測試用例。

(4)將判定表中的列轉(zhuǎn)換為測試用例。
| 編號 | 用例 | 輸出 | 編號 | 用例 | 輸出 |
|---|---|---|---|---|---|
| 1 | A,1 | 對文件做了更新 | 4 | 1,A | 產(chǎn)生提示信息X12,X13 |
| 2 | B,1 | 對文件做了更新 | 5 | A,A | 產(chǎn)生提示信息X13 |
| 3 | 1,1 | 產(chǎn)生提示信息X12 | 6 | B,B | 產(chǎn)生提示信息X13 |
二、將因果圖轉(zhuǎn)換為判定表的思路(以上述的例子來說明)
- 選擇一個“果”作為當(dāng)前狀態(tài)。例:71。
- 對因果圖回溯,找出導(dǎo)致該“果”為1的所有因的組合(需要考慮到約束條件)。例:001,000。
- 在判定表中為每個“因”的組合生成一列。例:(列3)和(列4)。
- 對于每種“因”的組合,判斷所有其他“果”的狀態(tài),并放置在對應(yīng)的每一列中。例:已得在001,000兩種組合下結(jié)點(diǎn)71的結(jié)果為1。判斷在“因”為001的組合下,得到70和72的結(jié)果為0。判斷在“因”為000的組合下,得到70的結(jié)果為0,72的結(jié)果為1。將“果”的狀態(tài)填入其對應(yīng)的列。
對因果圖進(jìn)行回溯時,需要做到以下考慮:
a) 當(dāng)回溯經(jīng)過一個結(jié)果為1的OR結(jié)點(diǎn)時,不要將OR結(jié)點(diǎn)的1個以上的輸入同時設(shè)為1。
b) 當(dāng)回溯經(jīng)過一個結(jié)果為0的AND結(jié)點(diǎn)時,應(yīng)列舉出導(dǎo)致該結(jié)果為0的所有輸入情況的組合。然而,當(dāng)該AND結(jié)點(diǎn)的一個輸入條件為0時,其他輸入有一個或更多的1,則不必考慮其他輸入為1的所有情況。
c) 當(dāng)回溯經(jīng)過一個結(jié)果為0的AND結(jié)點(diǎn)時,所有輸入皆為0的這一種情況應(yīng)當(dāng)列舉出來。

(1) 根據(jù)上述第c)條思路,我們只需列出使得結(jié)點(diǎn)⑤和結(jié)點(diǎn)⑥皆為0的情況。結(jié)點(diǎn)①②③④的取值狀態(tài)為:
0,0,0,0 (5=0,6=0)
(2) 根據(jù)第b)條思路,對于結(jié)點(diǎn)⑤為1而結(jié)點(diǎn)⑥為0的情況,應(yīng)該列出導(dǎo)致⑥為0的所有輸入情況組合。同時,只需列出一種使得⑤為1的情況即可,不需要列出⑤為1時的所有輸入情況組合。又根據(jù)第a)條思路,當(dāng)結(jié)點(diǎn)⑤為1時,我們不應(yīng)將結(jié)點(diǎn)①和②同時設(shè)為1。于是,得到結(jié)點(diǎn)①②③④的取值狀態(tài):
1,0,0,0 (5=1,6=0)
1,0,0,1 (5=1,6=0)
1,0,1,0 (5=1,6=0)
同樣的,對于⑤為0而⑥為1的情況,也只需要列出⑥為1的一種情況即可(盡管在本例中也只有這一種)。
0,0,1,1 (5=0,6=1)
因果圖有助于用一個系統(tǒng)的方法選擇出高效的測試用例集。它還有一個額外的好處,就是可以指出規(guī)格說明的不完整性和二義性。但通常它不能生成全部應(yīng)該被確定的有效測試用例。
注意:因果圖方法沒有充分考慮邊界條件。建議,最好是單獨(dú)考慮邊界值分析。這不意味著我們要為此增加相應(yīng)多的測試用例,而是在由因果圖生成測試用例時,可以將邊界條件分析一并考慮進(jìn)去。最好的結(jié)果是既滿足了兩方面的目標(biāo),又不需要增加新的測試用例。
四、錯誤推測
錯誤猜測是一項(xiàng)依賴于直覺的非正規(guī)的過程,其基本思想是人們利用直覺和經(jīng)驗(yàn)猜測可能犯得錯誤或錯誤易發(fā)情況的清單,然后編寫測試用例來暴露這些錯誤。
例如,程序輸入中出現(xiàn)0這個值,就是一種錯誤易發(fā)情況。因此可以編寫測試用例檢查特定的輸入值中有0,或特定的輸出值被強(qiáng)制為0的情況。
同樣,在出現(xiàn)輸入或輸出數(shù)目不定的地方,如,對某個列表進(jìn)行搜索,結(jié)果為“空列表”或“只包含一個”條目的列表,也是錯誤容易發(fā)生的情況。
另一個思想是,在閱讀規(guī)格說明時,聯(lián)系程序員可能做的假設(shè)來確定測試用例。如規(guī)格說明中被忽略的一些內(nèi)容,要么是由于偶然因素,要么是程序員認(rèn)為其顯而易見。