在測試過程中,測試人員經常需要將測試對象的各種輸入參數進行組合之后進行測試。有時候,將各種輸入參數進行組合,得到的測試用例數目將是非常龐大的。由于測試時間和成本的限制,無法對測試對象輸入值的所有組合進行測試。下面是某個網站測試的要求:
------------案例描述:開始-------------
某網站需要支持
● 不同的瀏覽器:IE5.0、IE5.5、IE6.0、Netscape6.0、Netscape6.1、Netscape7.0、Mozilla1.1和Opera7;
● 不同的插件:RealPlayer、MediaPlayer或者沒有任何插件None;
● 不同的客戶端操作系統:Windows95、Windows98、WindowsME、、WindowsNT、Windows2000和WindowsXP;
● 不同的Web服務器軟件:IIS、Apache和WebLogic;
● 不同的服務器端操作系統:WindowsNT、Windows2000和Linux。
這種情況下,需要針對不同的組合進行測試:
● 8種瀏覽器
● 3種插件
● 6種客戶端操作系統
● 3種Web服務器軟件
● 3種服務器端操作系統
如果考慮所有參數不同取值的組合,那么需要設計和執行的測試用例的數目是1296(8 x 3 x 6 x 3 x 3 = 1296)。
------------案例描述:結束-------------
在軟件測試過程中,這種類型的組合是非常普遍的。每種情形都可能有龐大的組合需要進行測試,假如不對它們進行測試,可能會存在較大的風險;而如果對所有組合進行測試,測試時間和資源又不允許。測試人員在面對這種情況的時候,可以采用以下幾種常用的策略:
● 嘗試測試所有輸入的組合,延期項目,導致的后果可能是失去產品的市場。
● 選擇一些容易設計和執行的測試用例,而忽略其是否能夠提供產品質量的信息。
● 羅列所有的組合,并隨機選擇其中的子集進行測試。
● 采取特殊的測試技術,選擇能發現大部分缺陷的子集進行測試。
如果采用最后一個策略,那么使用結對測試技術是一個很好的選擇。采用結對測試的技術,測試并不針對輸入值的所有組合進行測試,而只是針對所有輸入值的兩 兩組合。結對測試技術可以顯著地減少測試用例的數目,同時保證較高的測試質量。下面是應用結對測試技術減少測試用例數目的例子:
● 假如軟件系統有四個不同的輸入參數,每個參數有3個不同的輸入值,得到的完全組合數目是34即81。假如采用結對測試的技術,只需要9個測試用例即可覆蓋所有參數的兩兩組合。
● 假如軟件系統有13個不同的輸入參數,每個參數有3個不同的輸入值,得到的完全組合數目是313即1594323。假如采用結對測試的技術,只需要15個測試用例即可覆蓋所有參數的兩兩組合。
● 假如軟件系統有20個不同的輸入參數,每個參數有10個不同的輸入值,得到的完全組合數目是1020。假如采用結對測試的技術,只需要180個測試用例即可覆蓋所有參數的兩兩組合。
結對測試技術能夠發現所有的單模式失效(Single-mode Fault)和雙模式失效(Double-mode Fault)。但是,結對測試并不一定適合于發現測試對象中的多模式失效(Multimode Fault)。
● 單模式失效:失效是由單個參數引起的,只要針對所有獨立參數進行測試,就能夠發現該失效。
● 雙模式缺陷:失效是由兩個參數共同引起的,必須針對所有參數的兩兩組合進行測試,才能夠確保發現此類缺陷。
● 多模式缺陷:失效是由三個或三個以上參數共同引起的,采用結對測試技術也可能發現多模式缺陷,但是不能保證測試的充分性。
下面的幾個數據可以說明結對測試技術的有效性:
● 根據AT&T在對其基于局域網的郵件系統進行的測試中,應用結對測試技術得到的1000條測試用例比其原有的1500條測試用例多發現了20%的缺陷,而測試工作量卻減少了50%。
● National Institute of Standards and Technology在一項對醫療設備測試所進行的15年追蹤中發現,有98%的軟件缺陷可以通過結對測試技術發現。
● 根據對Mozilla網頁瀏覽器的缺陷分析顯示,76%的缺陷可以通過結對測試技術發現。
具體的結對測試,可以通過不同的測試技術來得到,包括正交矩陣(Orthogonal Arrays)的方法、James Bach提供的Allpairs方法,也可以通過分類樹方法。表1得到的測試用例是通過Allpairs方法實現的,詳細的內容以及其他測試技術的實現方 法,可以參考《軟件測試設計》原著。
圖1 使用Allpairs得到的測試數據

假如測試數據列表中的某個參數的取值以~開頭,那么說明該參數取值已經有兩兩組合了。以~開頭的參數取值,可以用該 參數的任何其他取值來代替,而不會影響其兩兩組合的覆蓋率。因此,可以將以~開頭的參數取值,用更關鍵的或者經常使用的參數值來代替。同時,使用 Allpairs得到的測試數據中,還羅列了所有的兩兩組合,并且統計了每個兩兩組合出現的次數,以及每個測試用例所包含的兩兩組合數。
從上面的結果可以看到:通過采用合適的測試技術,測試用例數目原來需要1296個,而目前只需要48個進行覆蓋,測 試用例數目減少了96%。前面已經提到了,結對測試可以發現所有的單失效模式和雙失效模式的缺陷,而實踐過程中,大部分的失效是單失效模式和雙失效模式, 多失效模式占的比例很少。因此,通過采用合適的結對測試,可以大大降低測試用例數目,減少測試工作量,同時可以實現較好的測試覆蓋率,保證測試質量。