1. 程式人生 > >【測試演算法】深入淺出Pairwise 演算法

【測試演算法】深入淺出Pairwise 演算法

深入淺出Pairwise 演算法

作者:王勇 

軟體測試是軟體開發中很重要的一環,在軟體成本中也佔著很大的比重。本文在介紹pairwise演算法的基礎上,提出了針對某一類問題的擴充套件演算法並加以實現。

       本文的組織結構如下:

第一,  本文首先簡要介紹一下測試界中的著名的pairwise演算法(約佔文章的50%)。

第二,  然後提出了一種對pairwise演算法的擴充套件演算法(擴充套件演算法更適合用於測試某一類場合)。

第三,  最後,基於擴充套件演算法,使用java語言開發出測試用例生成工具jCase。

目錄

軟體測試

軟體測試是軟體工程中一個重要的活動,它有4個原則:

(1)儘早的和不間斷的進行軟體測試

(2)對所有產品進行全面測試

(3)關注軟體開發全過程

(4)根據不同的需求,選用適當的測試模型

軟體測試分為黑盒測試和白盒測試。Pairwise演算法就是針對軟體測試中的黑盒測試提出來的一個行之有效的測試方法。

       Pairwise是L. L. Thurstone(29 May1887 – 30 September 1955)1927首先提出來的。他是美國的一位心理統計學家。Pairwise也正是基於數學統計和對傳統的正交分析法進行優化後得到的產物。

Pairwise基於如下2個假設:

(1)每一個維度都是正交的,即每一個維度互相都沒有交集。

(2)根據數學統計分析,73%的缺陷(單因子是35%,雙因子是38%)是由單因子或2個因子相互作用產生的。19%的缺陷是由3個因子相互作用產生的。

因此,pairwise基於覆蓋所有2因子的互動作用產生的用例集合價效比最高而產生的。

假設有3個維度,每個維度有幾個因子。如下:

瀏覽器:M,O,P

操作平臺:W(windows),L(linux),i(ios)

語言:C(chinese),E(english)

求解:

使用pairwise演算法,有多少個測試case?具體是什麼case?

我們沿用數學做題的格式。

解:

如果不用pairwise演算法,我們需要 3*3*2=18個測試case。下面是具體的case:

1,M W C

2,MW E

3,M L C

4,M L E

5,M I C

6,M I E

7,O W C

8,O W E

9,O L C

10,O L E

11,O I C

12,O I E

13,P W C

14,P W E

15,P L C

16,P L E

17,P I C

18,P I E

一共有18個,很繁瑣。但是這是100%的測試覆蓋率,缺陷率也是100%。

現在我們使用pairwise,看看結果如何?

首先咱們從最下方一個18號開始,它是 P I E,兩兩組合是 PI ,PE ,IE。看這3個組合在以上的相同位置出現過沒有,PI在17號,PE在16號,IE在12號出現過。所以18這個case就可以捨去。

最終剩下的如下:

1,MWC

4,MLE

6,         MIE

7,         OWE

9,         OLC

11,    OIC

14,    PWE

15,    PLC

17,PIC

共計9個測試case,節省了50%的測試case。

現在我們從上面開始重新做一次。1號是MWC,兩兩組合是MW MC WC 都出現過,去掉。

最終剩下的是:

2,MWE

4, MLE

5, MIC

8, OWE

10, OLE

11, OIC

13 PWC

15 PLC

18 PIE

       這樣也是剩下9個測試case,但是具體的case內容不一樣。經過L. L. Thurstone證明,pairwise演算法最終剩下的測試case個數肯定相同,但是可以有不同的case組合。

       Pairwise演算法和正交分析法進行比較,當有3個維度,每個維度有4個因子的時候:

(1)正交分析法的case數量:4*4*4=64個

(2)Pairwise演算法的case數量:20個

Pairwise的case數量是正交設計法的三分之一。當維度越多的時候,效果越明顯。當有10個維度的時候 4*4*4*4*3*3*3*2*2*2=55296個測試case,pairwise為24個。是原始測試用例規模的0.04%。

       Pairwise演算法和單因素測試用例設計的比較,能夠覆蓋到兩個維度的正交組合設計。能適當減少遺漏的測試。

       Pairwise演算法和全正交設計法的比較,全正交設計法,測試case太多,投入的成本太大。Pairwise演算法在數學統計分析的基礎上,對傳統的全正交設計法進行了優化,適當的提高了效率。

       基於XXXX的各類專案,經過初步統計如下:

專案名稱

專案組

維度個數

備註

xxx1

張組

3

平臺,機器,軟體版本

xxx2

張組

4

Ip和域名,udp,字尾表

xxx3

齊組

2

Ip黑白名單,域名黑白名單

xxx4

3

註冊商,ip和域名

       可以看出,每一個專案的維度都保持在5個以下,並且有重要維度和一般維度的區分。根據這2個特點,提出了pairwise的擴充套件演算法。

XXXX的各類專案維度都不多,並且每個維度的因子也不太多。測試人員可以很好的把握測試維度,難度不高。適合pairwise演算法。

在一般維度方面,重要性是平均的,所以在維度1上,是一個平面,它和維度2(平面),相交,是一條線,具體到因子,就是一個點。所以我們找到了一組case。

在重要維度方面,重要性不是平均的,我們採用正交表的曲面理論。比如維度1是重要維度,我們採用曲面表示,如果維度2也是重要維度,那麼,維度1和維度2相交,就是2條線。具體到因素,就是2個點(或者多個點)。如果維度2是一般維度(平面),曲面和平面相交,也有可能是1條線,也可能是2條線。我們這裡選1條線。

綜上所述,重要維度方面要適當增加測試case。具體怎麼加見如下方法:

1,         按照輸入維度的順序全排列測試case。(輸入維度的順序代表重要性從高到底)

2,         從第一個開始往下使用pairwise演算法過濾case。

3,         從最後一個開始往上使用pairwise演算法過濾case。

4,         找出以上2組中相同case的數量,就是要增加的case的數量。

5,         增加的case是步驟4中相同的case的,變換維度1和維度2生成的case。

       現有很多程式都是圍繞pairwise演算法產生的,最著名的就是ReduceArray;SmartDesgin 和微軟的PICT。

按照pairwise擴充套件演算法開發了一個jCase程式,部署在http://xxxxx.cn/ 上的測試工具庫中。基本理論如第3小節所述。

開發環境:eclipse 3.2

JDK:1.6+

部署容器:tomcat

核心流程:

1,         獲取維度和因子進行全排列。

2,         得到具體的case的兩兩因子組合(帶位置)。

3,         判斷這個case中兩兩因子組合是否在上面出現過,如果出現一個就刪除掉。全部都沒出現過,就保留這個case。

4,         按照不同的順序使用pairwise演算法再過濾一遍。

5,         得到2組資料,找出相同的case。

6,         按照維度的順序增加case。

核心程式碼如下:

private booleanjudge(String[] tpm, HashMap copyresult) {

        Stringstr = "";

        for(int i=0; i<tpm.length; i++)

        {

            str+= tpm[i]+";";

        }

        str= str.substring(0,str.length()-1);

        copyresult.remove(str);

        ArrayList r =newArrayList();

        int len = tpm.length;

        for (int i = 0; i < len; i++){

            for (int j = i + 1; j < len;j++) {

                String[]st = newString[len];

                for (int k = 0; k < len; k++){

                    st[k]= "*";

                }

                st[i]= tpm[i];

                st[j]= tpm[j];

                Stringss = java.util.Arrays.asList(st).toString();

                ss= ss.replaceAll("\\[","").replaceAll("\\]","");

//                  System.out.println(ss);

                r.add(ss);

            }

        }

        boolean bol =true;

        for (int i = 0; i < r.size();i++) {

            boolean flag =false;

            Stringk = (String) r.get(i);

            Iteratoriter = copyresult.entrySet().iterator();

            while (iter.hasNext()) {

                Map.Entryentry = (Map.Entry) iter.next();

                Stringt = (String)entry.getKey();

                if (cnniccompare(t, k)) {

                    bol= bol && true;

                    flag= true;

                    break;

                }

            }

            if (!flag)

                bol= false;

        }

        copyresult.put(str,str);

        return bol;

    }

       (1)Pairwise對於維度的分解來說,需要對業務很熟悉。以及需要正交測試法的理論支援。需要中等專業的測試人員才能完成。

       (2)pairwise還是有一定的遺漏。相比於全正交設計法來說,pairwise演算法對於多於2個因素相互作用所產生的bug,沒有覆蓋到。

轉自:http://blog.csdn.net/aassddff261/article/details/42776543