背景
缺陷往往是由一個參數或兩個參數的組合所導致的,那么我們選擇比較好的測試組合的原則就是
1)每個因子的水平值都能被測試到
2)任意兩個因子的各個水平值組合都能被測試到
基於上述考慮,本次采用配對測試法進行條件組合,如果完全覆蓋四個因子的所有參數配置,則需要進行笛卡爾積運算:3*2*2*4=48,共48測試用例。使用工具后僅12條即可
對於多輸入參數組合類的測試方法目前業界流行兩種方法,一種是OATS(Orthogonal Array Testing Strategy),即正交表法;另一種是Pairwise/All-Pairs Testing,即配對測試法,
正交表是為正交試驗服務的,它要求對任意兩個因素的取值組合實施“等概率”覆蓋,以便實驗樣本“均勻”地分布在樣本空間。“等概率覆蓋”有助於在正交試驗中確定各個因素對實驗結果的影響,其目的不是:提高錯誤檢測能力。
組合測試(Combinatorial Test)是一種測試用例生成方法。它將被測試應用抽象為一個受到多個因素影響的系統,其中每個因素的取值是離散且有限的。兩因素(Pairwise)組合測試生成一組測試用例集,可以覆蓋任意兩個因素的所有取值組合,在理論上可以暴露所有由兩個因素共同作用而引發的缺陷,配對測試法,就是組合測試的一種
組合測試簡介
組合測試(Combinatorial Test)是一種測試用例生成方法。它是將被測系統抽象出來的變量的取值進行組合並生成一組測試用例的過程,它將被測試應用抽象為一個受到多個因素影響的系統,其中每個因素的取值是離散且有限的。多因素(N- way,N>2)組合測試可以覆蓋任意N個因素的所有取值組合,在理論上可以發現由N個因素共同作用引發的缺陷。
配對測試(pairwise)它可以根據你設定的條件,自動生成在測試效率和測試覆蓋率之間做出平衡的組合,由於兩因素組合 測試在測試用例個數和錯誤檢測能力上達到了較好的平衡,它是目前主流的組合測試方法。
pairwise算法
Pairwise是L. L. Thurstone(29 May1887 – 30 September 1955)在1927年首先提出來的。他是美國的一位心理統計學家。Pairwise也正是基於數學統計和對傳統的正交分析法進行優化后得到的產物。
Pairwise基於如下2個假設:
(1)每一個維度都是正交的,即每一個維度互相都沒有交集。
(2)根據數學統計分析,73%的缺陷(單因子是35%,雙因子是38%)是由單因子或2個因子相互作用產生的。19%的缺陷是由3個因子相互作用產生的。因此,pairwise基於覆蓋所有2因子的交互作用產生的用例集合性價比最高而產生的。
那么我們選擇比較好的測試組合的原則就是:
- 每個因子的水平值都能被測試到;
- 任意兩個因子的各個水平值組合都能被測試到,這就叫配對測試法。
現很多程序都圍繞pairwise算法產生,最著名的就是ReduceArray,SmartDesgin和微軟的PICT工具,本文主要介紹PICT工具的使用。
PICT(推薦)
PICT工具介紹
PICT的全稱是Pairwise Independent Combinatorial Testing tool,它會根據輸入而自動給出推薦的測試組合,提高測試效率。是一款免費軟件:PICT下載地址。安裝以后,有詳細的幫助文件PICTHelp.htm。
PICT生成測試用例步驟
1、確認模型文件(Model File)
在txt文件中,確認所有影響因子及各因子的可配置值,如下:
升級類型:關機,立即,推遲
設備數據:保存,不保存
是否強制升級:是,否
客戶端環境:關機,重啟,斷電,斷網
注意:冒號前是因素名,后面是可取值,冒號和逗號均使用英文標點
2、運行PICT工具生成用例
在命令行上運行"pict.exe picta.txt > pictb.xls"所生成的文件pictb.xls是兩因素組合測試用例集,其內容如下:
升級類型 |
設備數據 |
是否強制升級 |
客戶端環境 |
關機 |
保存 |
否 |
重啟 |
關機 |
不保存 |
是 |
斷電 |
立即 |
不保存 |
否 |
斷電 |
立即 |
保存 |
是 |
重啟 |
關機 |
不保存 |
否 |
斷網 |
立即 |
保存 |
是 |
關機 |
推遲 |
保存 |
是 |
斷網 |
關機 |
不保存 |
否 |
關機 |
推遲 |
不保存 |
否 |
關機 |
推遲 |
保存 |
是 |
斷電 |
立即 |
不保存 |
是 |
斷網 |
推遲 |
不保存 |
是 |
重啟 |
可見,使用PICT生成組合測試用例非常方便,測試者可以輕松地理解並修改,測試工具可以方便地解析並運行,另外,也可以定義輸出的文件為其他格式文件,如:txt文件、word文件。
3、結合實際場景對用例進行分析修正
根據實際模塊進行分析
PICT的其他高級應用
1、PICT參數介紹
在cmd中輸入pict后,會彈出參數界面,如下:
Options: /o:N:指定“完全覆蓋”的維度(參數個數),默認2 /d:C:模型文件的參數分隔符,默認為分號 /a:C:用於指定別名(alias)的分隔符 ,默認: | /n:C:表示非法值得的前綴,默認~ /e:file:定義隨機種子文件(File with seeding rows) /r:N: 定義隨機種子 (Randomize generation, N – seed) /c :指定模型計算是大小寫敏感(默認不敏感)(Case-sensitive model evaluation) /s :顯示模型的統計信息(Show model statistics)
2、定義模型文件中各因素的約束關系
在組合測試的基礎理論中,各個因素的取值是相互獨立的,即因素A的取值不會影響因素B的取值。但是,大多數被測試應用的因素之間存在約束關系。
以上述升級測試為例,當因素【升級類型】的取值是【立即】時,因素【客戶端環境】不可能取值【關機】、【重啟】,因為選擇立即升級后,就開始升級了,用戶不可能手動去進行關機和重啟操作
如果不考慮約束關系,可以在生成用例后,刪除無效的用例即可,但是這樣會導致最終的測試用例集不能實現兩因素或多因素組合覆蓋,如上的例子:
升級類型 |
設備數據 |
是否強制升級 |
客戶端環境 |
關機 |
保存 |
否 |
重啟 |
關機 |
不保存 |
是 |
斷電 |
立即 |
不保存 |
否 |
斷電 |
立即 |
保存 |
是 |
重啟 |
關機 |
不保存 |
否 |
斷網 |
立即 |
保存 |
是 |
關機 |
推遲 |
保存 |
是 |
斷網 |
關機 |
不保存 |
否 |
關機 |
推遲 |
不保存 |
否 |
關機 |
推遲 |
保存 |
是 |
斷電 |
立即 |
不保存 |
是 |
斷網 |
推遲 |
不保存 |
是 |
重啟 |
假如直接在用例中刪除上述兩個不可能的組合,則:關機與保存沒有覆蓋,是不合理的,所以最好在生成測試用例時由工具來過濾。
在PICT的模型文件中,加入如下的約束(Contraint)語句,就可以定義出因素之間的約束關系。
IF [升級類型] = "立即" THEN [客戶端環境] <> "重啟"; IF [升級類型] = "立即" THEN [客戶端環境] <> "關機";
修改后的模型文件如下:
升級類型:關機,立即-推遲 設備數據:保存,不保存 是否強制升級:是,否 客戶端環境:關機,重啟,斷電,斷網 IF [升級類型] = "立即" THEN [客戶端環境] <> "重啟"; IF [升級類型] = "立即" THEN [客戶端環境] <> "關機";
根據修改后的模型文件,生成的測試用例如下:
升級類型 |
設備數據 |
是否強制升級 |
客戶端環境 |
推遲 |
保存 |
否 |
斷網 |
關機 |
不保存 |
是 |
斷網 |
立即 |
不保存 |
否 |
斷電 |
推遲 |
不保存 |
是 |
關機 |
立即 |
保存 |
是 |
斷網 |
關機 |
保存 |
否 |
重啟 |
推遲 |
不保存 |
是 |
重啟 |
關機 |
保存 |
否 |
關機 |
關機 |
保存 |
是 |
斷電 |
推遲 |
不保存 |
否 |
斷電 |
可以看出上述的關機與保存沒有覆蓋的問題,在新的用例里已經解決了。
3、多因素組合測試
前面pairwise算法中有介紹了:根據數學統計分析,73%的缺陷(單因子是35%,雙因子是38%)是由單因子或2個因子相互作用產生的。19%的缺陷是由3個因子相互作用產生的。也就是說:按照配對測試法,有27%的缺陷會被遺漏。
而且在全覆蓋與效率之間的取舍,也要根據所測對象來判斷,如果測試的是醫療設備,那么更應該保證全覆蓋,而不是考慮效率。
接下來介紹如何PICT,生成多因素組合用例,有兩種方法
方法一:命令行增加參數
在命令行上使用參數"/o:N"。例如,在命令行上執行"pict.exe picta.txt /o:3",就可以生成三因素組合測試用例集。
方法二:定義子模型
在PICT的幫助文件中有如下的模型文件定義。
PLATFORM: x86, ia64, amd64 CPUS: Single, Dual, Quad RAM: 128MB, 1GB, 4GB, 64GB HDD:SCSI, IDE OS: NT4, Win2K, WinXP, Win2K3 IE: 4.0, 5.0, 5.5, 6.0 APP: SQLServer, Exchange, Office { PLATFORM, CPUS, RAM, HDD } @ 3 { OS, IE } @ 2
根據該模型文件,PICT將對PLATFORM, CPUS, RAM, HDD實施3因素組合覆蓋,具體的生成策略可參加下圖。PICT在兩因素組合覆蓋的基礎上,對某些因素實施多因素組合覆蓋,這有助於實現更靈活的測試策略。
4、考慮在回歸測試中引入隨機種子
如果每次都使用相同的測試用例,測試用例可能只是反復執行相同的路徑,覆蓋相同的狀態空間,也許不能發現隱藏的缺陷。
如果在測試對象和測試需求不變的情況下,每次都用新的測試用例,隨着回歸次數的增長,測試執行可以執行更多的路徑,發現隱藏缺陷的概率也會提高,在PICT中,隨機種子的作用就在於此。
在PICT中,參數"/r[:N]"可以為測試用例生成引入隨機種子(N是作為隨機種子的整數),以生成不同的測試用例,如下:
pict picta.txt /r:6
pict picta.txt /r:8
上述兩個命令生成的用例均可以滿足兩因素覆蓋的要求,且兩次用例不一樣。
5、衛哨語句
許多軟件用衛哨語句來“過濾”無效的輸入。例如,在如下代碼中,if語句會“過濾”掉所有A<=0的輸入。
int func(int A, int B, int C) {if (A <= 0) return ERROR; ... }
如果不讀代碼,沒有仔細分析規格說明,可能會制定如下的模型文件。在該模型中,A的取值是-1, 0, 1。
A: -1, 0, 1 B: -1, 0, 1 C: -1, 0, 1
利用上述模型,所生成的測試用例集包含9條測試用例。
A B C 0 1 -1 1 -1 1 -1 0 -1 1 1 0 -1 -1 0 0 0 1 1 -1 - 1 -1 1 1 0 -1 0 1 0 0
在這9條測試用例中,有6條測試用例會被if語句過濾掉,因為其中A<=0。只有3條測試用例,能夠執行后續邏輯,這意味着只有1/3的B和C的取值組合被真正地覆蓋。這個例子表明,如果忽視了衛哨語句對執行流的中斷,組合測試用例集將不能達成兩因素或多因素覆蓋的目標 。
方法一:人為修改模型文件
面對此類問題,測試人員要仔細閱讀規格說明或源代碼,發現會導致執行流中斷的“負面”(Negative)取值。將負面取值從模型中排除,將因素的取值置於正常執行流的范圍。例如,對於上述被測試函數func,將模型文件定義為:
A: 1, 10, 100 B: -1, 0, 1 C: -1, 0, 1
在生成測試用例集之后,再加入一條的測試用例(A: 0,B: 0, C: 0)。原模型生成的測試用例可以“通過”衛哨語句,覆蓋因素A、B、C的兩兩取值組合;附加的測試用例可以覆蓋衛哨語句的“過濾”功能。
方法二:用參數由PICT判斷自動過濾
在PICT的模型中,用特殊符號"~"標記出非法(invalid)值(該符號可以自定義,具體見PICT參數介紹)。例如,在如下模型中,參數A的取值0被標記為非法。
A: ~0, 1, 10 B: -1, 0, 1 C: -1, 0, 1
PICT會保證所有有效值的取值組合都會被覆蓋,此外任意非法值與有效值的組合也會被覆蓋。以上模型將生成如下測試用例集,共12條。
A B C 1 1 -1 1 0 1 10 -1 -1 1 -1 0 10 0 -1 10 -1 1 10 0 0 10 1 0 1 1 1 ~0 0 -1 ~0 -1 0 ~0 1 1
如果很清楚被測試對象的實現邏輯,使用第一種方法可以生成規模較小的測試用例集,因為它幾乎不考慮非法值與有效值的組合。如果只是從規格說明中了解到程序可能存在衛哨語句,那么用第二種方法可以生成更“安全”的測試用例集。
圖形化PICT工具(CVG)(推薦)
CVG (Combinatorial Variation Generator)基於WPF和微軟Pairwise開發包的一個開源工具,可以定義組合維度、過濾條件,日常用例編寫已經足夠,推薦一下。
下載地址:CVG2.0,具體界面如下,點擊幫助可查看使用指南,這里就不介紹了
allpair
工具介紹
為了讓業界測試人員更能方便的使用全對偶測試法產生的組合測試的測試用例,James Bach使用Perl語言開發了一個allpairs工具:allpairs下載地址
Allpair生成測試用例步驟
1、確認模型文件(Model File)
輸入模型文件,該文件與PICT格式不一致,可以先輸入到Exce里,再選擇而文件——另存為txt文件即可。
升級類型 |
設備數據 |
是否強制升級 |
客戶端環境 |
立即 |
保存 |
否 |
關機 |
關機 |
不保存 |
是 |
重啟 |
推遲 |
斷電 |
||
斷網 |
2、運行allpairs工具生成用例
直接將 allpairs 工具下載並解壓到某個路徑,在 Dos 窗口下運行命令。切換到工具所在路徑,輸入 allpairs.exe model.txt >TestCase.txt 或者 allpairs a.txt > TestCase.txt 並回車,其中model.txt為模型文件,TestCase.xls為生成的測試用例,可以自定義。
輸出的testcase文件包括兩部分:
第一部分是測試用例的集合,【pairrings】列說明的是全對偶方法找到的唯一pairrings的數量;
第二部分列出了全組合的所有pair,且顯示了這個pair在測試用例列表中出現的次數,及所對應的測試用例的用例號。
3、結合實際場景對用例進行分析修正
根據實際模塊進行分析
參考資料
常用的Pairwise工具集:http://www.pairwise.org/tools.asp
深入淺出Pairwise 算法:http://m.blog.csdn.net/blog/aassddff261/42776543
組合測試法中的全對偶測試法:http://www.infoq.com/cn/news/2011/08/combination-test/
實施組合測試:http://www.cnblogs.com/liangshi/archive/2010/07/25/1784666.html
網頁詳細解釋了種子(seeding): http://www.amibugshare.com/pict/help.html
且提供了一個種子文件下載:http://www.amibugshare.com/pict/PICT_Seed_template.txt
什么是衛哨語句?
條件表達式中,2條分支都是正常行為,就應該使用形如if…..else…..的條件表達式;如果某個條件極其罕見,就應該單獨檢查該條件,並在該條件為真時立刻從函數中返回。這樣的單獨檢查常常被稱為“衛哨語句”。