Pairwise Testing 的Java實現

來源:互聯網
上載者:User

標籤:

本文只使用他人託管的jar包,不涉及具體演算法

      軟體測試通常要花費掉軟體開發組織30%~70%的開發資源,如何有效地提高軟體測試的效率是開發組織應該考慮的關鍵問題之一。由於很多情況下窮舉測試是不可行的,測試人員必須在時間和資源的有限性與測試覆蓋的徹底性之間做好權衡。解決這個問題的一個行之有效方法便是Pairwise Testing。

 

一、Pairwise Testing

先舉例子

在測試案例設計過程中,有時會遇到很多變數進行組合的情況,對相互組合的兩個或更多變數進行的測試活動就是組合測試,比如

作業系統:Win98,Win2K,WinXP印表機:HP 4050,HP 4100雙工:Y,N

完全測試需要包括所有這些參數的排列組合:

CASE        OS        印表機        雙工1        Win98        HP 4050        Y2        Win98        HP 4100        Y3        Win2K        HP 4050        Y4        Win2K        HP 4100        Y5        WinXP        HP 4050        Y6        WinXP        HP 4100        Y7        Win98        HP 4050        N8        Win98        HP 4100        N9        Win2K        HP 4050        N10       Win2K        HP 4100        N11       WinXP        HP 4050        N12       WinXP        HP 4100        N

利用Pairwise Testing,測試案例可以簡化成:

CASE    OS           印表機        雙工1        Win98        HP 4050        Y2        Win98        HP 4100        N3        Win2K        HP 4050        N4        Win2K        HP 4100        Y5        WinXP        HP 4050        Y6        WinXP        HP 4100        N

組合測試(Combinatorial Test)是一種測試案例產生方法。它將被測試應用抽象為一個受到多個因素影響的系統,其中每個因素的取值是離散且有限的。兩因素(Pairwise)組合測試產生一組測試案例集,可以覆蓋任意兩個因素的所有取值組合,在理論上可以暴露所有由兩個因素共同作用而引發的缺陷。多因素(N-way,N>2)組合測試可以產生測試案例集,以覆蓋任意N個因素的所有取值組合,在理論上可以發現由N個因素共同作用引發的缺陷。由於兩因素組合測試在測試案例個數和錯誤偵測能力上達到了較好的平衡,它是目前主流的組合測試方法。

成對測試(Pairwise Testing),是一種有效測試案例產生技術,通過對測試變數的所有維度及值的組合,避免窮舉測試所有維度所有值及其組合來減少測試案例數量。

成對測試這一概念是Mandl於1985年在測試Aad編譯器時提出來的。Cohen等人應用成對組合覆蓋測試技術對Unix中的“Sort”命令進行了測試。測試結果表明覆蓋率高達90%以上。可見成對組合覆蓋是一種非常有效測試案例設計方法。

為了更好地理解其概念本身,首先引入幾個相關概念的介紹。因素,就是影響軟體行為的參數或變數;水平,就是某個因素的可能取值;強度,就是因素之間相互關係的程度,取值為二時只考慮兩兩因素的取值對軟體行為的影響,取值為三時考慮任意三個因素的取值對軟體行為的影響;次數,就是所產生的測試案例的個數。

因為“大多數故障是由最多兩個因素相互作用引起的”,Pairwise Testing便是強度為二的情況,其要求任意兩個因素的所有水平之間的組合至少要被覆蓋1次,產生的測試案例可以保證各個因素每個水平之間的兩兩組合至少出現一次。在因素和水平的數量很大時,Pairwise Testing對測試案例的精簡效果顯著。成對測試的演算法已經被很多工具實現,例如:TConfig、微軟的PICT等。

Pairwise Testing有一個官網:http://www.pairwise.org/

其中包括大量Pairwise Testing工具:http://www.pairwise.org/tools.asp

目測其中的大多數連結都需要科學上網,最有名的是PICT。

 

二、Pairwise Testing 的數學基礎

Pairwise Testing具有嚴謹的數學基礎——正交表。

不要使用正交表,要使用PICT。

有一些文章介紹了利用正交表構造組合測試案例集的方法。雖然可行,但是正交表並不是理想的組合測試載入器。

首先,正交表的性質並不適用於軟體測試。正交表是為正交實驗服務的,它求對任意兩個因素的取值組合實施“等機率”覆蓋,以便實驗樣本“均勻”地分布在樣本空間。“等機率覆蓋”有助於在正交實驗中確定各個因素對實驗結果的貢獻,但是對於組合測試提高錯誤偵測能力並沒有協助。受到“等機率覆蓋”的約束,正交表往比“覆蓋即可”的組合測試載入器產生更多的測試案例,提高了測試成本。

第二,利用正交表構造組合測試案例並不方便。使用正交表構造測試案例,要尋找正確的正交表、對其進行剪裁、替換參數,方能獲得測試案例集。如果使用微軟提供的組合測試載入器PICT,產生測試案例會非常簡單。

 

三、PICT工具
PICT(Pairwise Independent Combinatorial Testing )原是微軟公司內部使用的一款自動產生成對組合測試案例的命令列工具,現在對外提供,可以從互連網上下載到。

PICT微軟相關:http://blogs.msdn.com/b/testercenter/

PICT:http://download.microsoft.com/download/f/5/5/f55484df-8494-48fa-8dbd-8c6f76cc014b/pict33.msi

PICT可以有效地按照兩兩測試的原理,進行測試案例的設計。在使用PICT時,需要輸入與測試案例相關的所有參數,以達到全面覆蓋的效果
1.模型檔案
PICT接收一個純文字檔案作為輸入,然後輸出測試案例集合。在文字檔中描述被測試應用的模型(Model),即該軟體有哪些因素、每個因素有哪些取值。該文字檔被稱為模型檔案。格式如下:
<ParamName1> : <Value1>, <Value2>, <Value3>, ...
<ParamName2> : <Value1>, <Value2>, <Value3>, ...
例如:將文字檔儲存為test.txt,儲存在E:\PICT\

OS:Win8,Win7,WinXP,Linux,MacOS資料庫:Oracle,MySQL,SQLServer,AccessJDK:1.8.0,1.7.0,1.6.0,1.5.0字元集:utf-8,GBK

2.運行PICT程式
命令列:

E:\PICT>pict test.txt

可以將結果輸出儲存至txt和xls檔案:

E:\PICT>pict test.txt > Output.txt

E:\PICT>pict test.txt > OutputFile.xls

3.PICT選項
/o:N   組合數,預設值為2,即pict產生的測試案例集中每條測試資料會有兩個值與其他測試集是不同的;
/d:C   值與值之間的分隔字元,預設為逗號(,),例如一個參數 作業系統  winxp,win7,win8 之間會用逗號隔開;
/a:C   別名間的分隔字元,預設是管道符(|),例如一個參數(使用者名稱不區分大小寫,但為了保證測試的可信度,可以用大小寫輪換的方式進行測試) 使用者名稱  admin|ADMIN;
/n:C   無效數值或者是非法數值的首碼,預設值為(~),例如一個參數(只能取1、2,為了測試非法值的輸入,取0,但又不希望0和其他參數的每隔值都配一次對,為了減少測試集的數量,在0前面加一個~)即 參數  ~0,1,2;
/e:file  定義種子檔案,作用是可以指定組合方式,例如在種子檔案seed.txt中指定一個組合方式,在執行1.txt時,命令:pict 1.txt /e:seed.txt  產生的測試集中會包含seed中指定的組合集(當然指定的組合集有一定條件)。(此參數目前的理解可能會有誤區);
/r[:N]  通過/r參數,可以使每次產生的測試集不同;
/c        加上該參數,說明參數值完全區分大小寫
/s        顯示模型統計資料

4.PICT的更多細節

關於PICT有更多複雜的用法,可查看PICT的協助文檔,還可參考

Liang Shi 實施組合測試 http://www.cnblogs.com/liangshi/archive/2010/07/25/1784666.html

Wade Xu 具有約束關係的因素如何實施組合測試 http://www.cnblogs.com/wade-xu/p/4220496.html

 

四、Pairwise Testing 的Java實現

1.Pairwise Testing Service

有關Pairwise Testing的具體演算法網上的資料少的可憐,我只找到一個Pairwise Testing Service項目託管在Google Code上

http://code.google.com/p/pairwisetestingservice/source/browse

此項目對Pairwise Testing介紹的極為詳細,其中有核心包和源碼,還有一個Construction Orthogonal Arrays.ppt和一個Pairwise Testing - Orthogonal Arrays Strategy.doc檔案,詳細介紹了Pairwise Testing的數學基礎與實現方法。另外,這個項目是中國程式員寫的,在此對作者表示崇高的敬意。

Google Code 快要關了,我把 Pairwise Testing Service 中的部分檔案存在了我的網盤裡:http://pan.baidu.com/s/1dDo3t7r

2.Pairwise Testing Service 演算法

Pairwise Testing是個大家族,按照所基於的理論背景不同,可以分為電腦科學的方法和數學的方法兩大類。電腦科學的方法都是基於啟發學習法演算法,不能得到最優解,典型代表是Jenny、PICT和TVG。數學方法的典型代表是正交表,雖然能在一些特定的場合得到最優解,但受限於數學基礎的理論限制而無法應用於所有場合。

Pairwise Testing Service便是基於正交表的Pairwise Testing。

也就是說,Pairwise Testing Service的演算法與其他PICT等軟體是不同的!

啟發學習法演算法(heuristic algorithm)是相對於最佳化演算法提出的。一個問題的最優演算法求得該問題每個執行個體的最優解。啟發學習法演算法可以這樣定義:一個基於直觀或經驗構造的演算法,在可接受的花費(指計算時間和空間)下給出待解決組合最佳化問題每一個執行個體的一個可行解,該可行解與最優解的偏離程度一般不能被預計。電腦科學的兩大基礎目標,就是發現可證明其執行效率良好且可得最佳解或次佳解的演算法。而啟發學習法演算法則試圖一次提供一或全部目標。 例如它常能發現很不錯的解,但也沒辦法證明它不會得到較壞的解;它通常可在合理時間解出答案,但也沒辦法知道它是否每次都可以這樣的速度求解。有時候人們會發現在某些特殊情況下,啟發學習法演算法會得到很壞的答案或效率極差,然而造成那些特殊情況的資料群組合,也許永遠不會在現實世界出現。因此現實世界中啟發學習法演算法常用來解決問題。啟發學習法演算法處理許多實際問題時通常可以在合理時間內得到不錯的答案。

3.Pairwise Testing Service 使用

我們使用如下例子

pairwisetesting.jar 需要 XOM 和 Google Collections。首先在java項目中包含pairwisetesting-core-1.1.jar,xom-1.1.jar,google-collect-snapshot-20080321.jar

建立PairwiseTesting.java

import pairwisetesting.PairwiseTestingToolkit;import pairwisetesting.coredomain.*;import pairwisetesting.engine.am.AMEngine;import pairwisetesting.testcasesgenerator.TXTTestCasesGenerator;public class PairwiseTesting {    public static void main(String[] args) throws Exception {        PairwiseTestingToolkit toolkit = new PairwiseTestingToolkit();        // 設定元參數提供者        toolkit.setMetaParameterProvider(new IMetaParameterProvider() {            public MetaParameter get() {                // 建立因素及其水平值                Factor f1 = new Factor("使用者星級");                f1.addLevel("一星");                f1.addLevel("二星");                f1.addLevel("三星");                Factor f2 = new Factor("使用者類型");                f2.addLevel("普通使用者");                f2.addLevel("學生");                f2.addLevel("內部員工");                Factor f3 = new Factor("封裝方式");                f3.addLevel("普通封裝");                f3.addLevel("加固封裝");                f3.addLevel("禮品封裝");                    // 強度為2                MetaParameter mp = new MetaParameter(2);                mp.addFactor(f1);                mp.addFactor(f2);                mp.addFactor(f3);                return mp;            }        });        // 使用AMEngine        toolkit.setEngine(new AMEngine());        // 使用文本輸出的測試案例產生器        toolkit.setTestCasesGenerator(new TXTTestCasesGenerator());        System.out.println(toolkit.generateTestCases());    }}

運行後得到輸出

使用者星級    使用者類型    封裝方式一星       普通使用者    普通封裝一星       學生       加固封裝一星       內部員工    禮品封裝二星       普通使用者    加固封裝二星       學生       禮品封裝二星       內部員工    普通封裝三星       普通使用者    禮品封裝三星       學生       普通封裝三星       內部員工    加固封裝

4.Pairwise Testing Service 詳細介紹

以下文本直接複製自Pairwise Testing - Orthogonal Arrays Strategy.doc

在綜合實踐項目中,我們將正交表的理論應用於Pairwise Testing Service的開發中,集中體現在AMEngine(Algebra Method Engine)的設計與實現中。Pairwise Testing Service中有很多其它Engine,所示的是AMEngine所處的位置。

TestDataTransformer是幾乎每個Engine都要自訂的轉換器,特別是對AMEngine,其原生的測試資料只是些數字,需要轉換成方便使用的資訊展示。 Engine是個抽象類別,其主要的介面如下:

+ String[][] generateTestData(MetaParameter mp)

# String[][] generateRawTestData(MetaParameter mp)

generateTestData是供上層調用的公用方法,其在內部會調用generateRawTestData來產生原生的測試資料,並使用TestDataTransformer來轉換原生的測試資料。MetaParameter包含了諸如因素、水平和強度等重要的輸入資訊。每個具體的Engine都要實現generateRawTestData這個抽象方法,以使用具體的策略來產生原生的測試資料。 AMEngine的內部設計如所示:

其中黑色箭頭指代委託關係,藍色線指代繼承關係。 標綠色的OLS_t2_OAProvider是Lt2(tm)型正交表(t為素數或素數冪)的實現,其產生的正交表所對應的解是最優的。 H_2s_OAProvider是基於哈陣的直積來構造二水平正交表的實現,其產生的正交表所對應的解不全是最優的。 OLS_tu_OAProvider是為瞭解決因素數大於水平數加1情況時引入的一種解決方案,其產生的正交表所對應的解不是最優的。 OLS_OAProvider會委託OLS_Provider來產生正交拉丁方完全組,根據水平數為素數還是素數的方冪,決定使用基於以素數為模的剩餘類域的Rp_OLS_Provider還是基於以不可約多項式為模的剩餘類域的Poly_OLS_Provider。標紅色的Poly_OLS_Provider的實現過程中使用了Jan Struyf所寫的有限域的Java實現。 AMEngine在接收到上層系統的請求後,會委託OAProviderFactory來構造能處理該請求的OAProvider,如果無法處理則拋出異常。這樣便把構造特定OAProvider的複雜邏輯從AMEngine分離出去,使職責得到分離,結構變得更清晰。

5.Pairwise Testing Service 適用情況

AMEngine在當各因素的水平數不同,或者因素數>水平數+1時,演算法使用的是不完善的實現方法,當差距過大時不宜使用

還有一個問題是關於因素特定取值組合的非法性,比如IE瀏覽器與Solaris作業系統的配對是一種無效的組合,不應當在測試中出現。但是由於正交表的方式是一下子就構造出整個表來,而不像啟發學習法演算法是一條一條地產生測試案例來逐步滿足Pairwise Testing所要求的測試覆蓋。這個構造過程的區別決定了基於正交表的AMEngine不像其它基於啟發學習法演算法的Engine那樣可以比較方便地處理該問題,當前的AMEngine實現並沒有考慮這種情況的處理。

6.Pairwise Testing Service 效能對比

在一些特定的場合,具體來說就是當測試案例與正交表能完美結合,因素數<=水平數且各因素的水平數完全相同時,基於正交表的AMEngine在效能和品質上都遠好於基於啟發學習法演算法的JennyEngine,但是由於數學性質的限制,能完全釋放正交表威力的場合還是相對狹小,應用場合較少。

 

五、總結

最後回到Pairwise Testing的主題。其目的是為了提高軟體測試的效率,那麼Pairwise Testing是否就如80/20原則那樣,只需花費很小的測試努力就能得到很大的測試回報?業界的應用給出了一些正面的例子,比如AT&T使用Pairwise Testing測試電子郵件軟體StarMail,結果顯示應用該方法後測試時間減少了一半,並且比傳統測試方法多發現了28%的缺陷,生產率是原來的2.6倍。

Pairwise Testing的有效性正是因為它能檢測出所有的單模和雙模錯誤,並也能檢測出很多多模錯誤,這與軟體中的錯誤常常是由少數的幾個變數相互作用引起的事實有著直接聯絡。但是也要警惕不要將Pairwise Testing看成是軟體測試的銀彈。挑選正確的因素需要花費精心的努力,需要領域專家、開發人員與測試人員的共同努力;並且決定各因素的水平值也需要結合已有的測試技術,如等價類別劃分和邊界值分析等。應該結合使用多種測試技術才能在實際應用中取得較好的結果。並且在性命攸關的應用中Pairwise Testing的測試覆蓋還達不到要求,需要應用強度大於2的組合測試或其它更嚴格的測試技術。

總之,Pairwise Testing不是萬能的,需要挑選恰當的場合去應用,才能真正有效地提高測試的效率,改善軟體的品質。

 

本文可理解為對Google Code 上 Pairwise Testing Service 的介紹,大量引述了其中的內容,若對作者的權益造成損害,請直接與我聯絡,我將無條件刪除本文。

Pairwise Testing 的Java實現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.