正交分析法設計理論及實踐
一、理念介紹
在黑盒用例設計方法中有一個大家耳熟能詳的正交分析法,卻鮮有人知 “Pairwise”設計理念。
設想一種常見的場景,工期很緊的專案,原定的測試時間被“無理”地壓縮之後,如何能用極少的時間去保證更高的質量呢?
舉個例子,如果讓你測試一下word字型效果,你會整理出多少個用例呢?
答案很簡單是2的七次方=128個用例,但當工期特別緊的時候(128個用例執行不完)你又會從中選取哪些用例來執行呢?
“Pairwise”(官網: http://www.pairwise.org/)是行之有效的一個思路或者是強有力的理論基礎。它是L. L. Thurstone(29 May1887 – 30 September 1955)在1927年首先提出來的。他是美國的一位心理統計學家。Pairwise也正是基於數學統計和對傳統的正交分析法進行優化後得到的產物。
Pairwise基於如下2個假設:
(1)每一個維度都是正交的,即每一個維度互相都沒有交集。
(2)根據數學統計分析,73%的缺陷(單因子是35%,雙因子是38%)是由單因子或2個因子相互作用產生的。19%的缺陷是由3個因子相互作用產生的。
因此,pairwise基於覆蓋所有2因子的互動作用產生的用例集合價效比最高而產生的。
舉例來說明:當因子A為a1、B為b1時,接下來不可出現A為a1、B為b1 或者是 B為b1、A為a1(為什麼會倒過來描述,可以思考一下)。
當然,在現實中會是有各種約束條件的,所以會出現IF … Then…,或者是在同一場景下,因子A、B、C之間的組合是可以精簡的,而因子D、E、F、G卻是需要全組合(在Pairwise中的術語稱謂“階”)。一個個完全依靠人工來進行輸出太麻煩,各大contributor貢獻出自己的開源工具,這裡挑一個大公司的(微軟)給大家介紹一下,工具名PICT。
工具下載地址:https://github.com/Microsoft/pict
最新的版本支援多平臺(linux、mac、windows),需要自行編譯。
二、PICT工具使用
1)先準備一個文字檔案abc.txt,內容如下:
直接執行pict abc.txt即可得到pairwise之後的結果:
如果需要全組合情況,則可以在命令列引數中指定/o:3,其中3是因子的個數,(/o的預設值是2,此引數為上面所述的“階”)如:
2)在文字中指定因子的組合情況,
直接執行pict abc.txt 即可得到全組合的
3)因子判斷結構:
輸出的結果:(滿足了當A為a1時,B不等於b2,C 不等於c3)
三、案例實踐
以“星火錢包——開 戶管理”的 “查詢” 功能測試為例來詳細介紹一下PICT工具的使用思路和過程。
查詢因子有:“星火使用者ID”、“開 戶狀態”、“開 戶渠道”、“開 戶時間”,其中每個因子的限制如下:
- 星火使用者ID:不限制輸入的內容
- 開 戶狀態:請選擇(預設)、開 戶成功、開 戶失敗
- 開 戶渠道:請選擇(預設)、開 戶成功、開 戶失敗
- 開 戶時間:選擇時間區間範圍(前端頁面的限制:填寫其一,另外一個值會自動填充相同的時間,結束日期>=開始日期)(先不考慮後臺介面的限制)。
每個因子需要考慮值的範圍為:
星火使用者ID:空(預設)、非數字、120988476548、120988476900
(假設120988476548是可以查詢出結果的,120988476900是查詢不出結果的)
開 戶狀態:請選擇(預設)、開 戶成功、開 戶失敗
開 戶渠道:請選擇(預設)、PC、wap、app
開 戶開始時間:空(預設)、20150101、20160101、20170101
開 戶結束時間:空(預設)、20150101、20150301、20160201、20160301、20171101
“星火使用者ID”、“開 戶狀態”、“開 戶渠道”這三個因子,比較好整理,如圖所示,直接按照上面的內容直接填寫至檔案中即可:
而“開 戶開始時間”“開 戶結束時間”有依賴性,所以,需要特殊處理,我們將它們之間的依賴“翻譯”成PICT所能理解的方式:
1)“填寫其一,另外一個值會自動填充相同的時間”
換句話說,“開 戶開始時間”“開 戶結束時間”只能同時為空。
“翻譯”:
IF [開 戶開始時間] = "空" THEN [開 戶結束時間]= "空";
IF [開 戶結束時間] = "空" THEN [開 戶開始時間]= "空";
( 當然,你也可以這樣寫: IF [開 戶開始時間] NOT IN {"20150101","20160101","20170101"} THEN [開 戶結束時間]= "空"; IF [開 戶結束時間] NOT IN {"20150101","20150301","20160201","20160301","20171101"} THEN [開 戶開始時間]= "空"; )
2)“結束日期>=開始日期”
“翻譯”:
IF [開 戶開始時間] <> "空" AND [開 戶結束時間] <> "空" THEN [開 戶開始時間] <= [開 戶結束時間];
準備好全部的“翻譯”結果,如圖所示:
我們先看一下“全組合”的用例總數為多少?答案481條,如圖所示:
使用Pairwise思想,整理出的用例數量僅為30條,如圖所示:
用例的詳細內容如下:(每行即每條用例)
星火使用者ID | 開 戶狀態 | 開 戶渠道 | 開 戶開始時間 | 開 戶結束時間 |
---|---|---|---|---|
120988476900 | 請選擇 | 請選擇 | 空 | 空 |
120988476548 | 開 戶失敗 | PC | 20150101 | 20171101 |
非數字 | 開 戶失敗 | wap | 空 | 空 |
120988476900 | 開 戶成功 | app | 20150101 | 20150301 |
空 | 請選擇 | pc | 20160101 | 20160301 |
120988476548 | 開 戶失敗 | app | 20160101 | 20160301 |
空 | 開 戶成功 | wap | 20170101 | 20171101 |
空 | 開 戶失敗 | 請選擇 | 20150101 | 20150301 |
非數字 | 開 戶成功 | pc | 20150101 | 20150101 |
空 | 請選擇 | wap | 20150101 | 20150101 |
非數字 | 開 戶成功 | 請選擇 | 20160101 | 20171101 |
非數字 | 請選擇 | app | 20150101 | 20160301 |
120988476548 | 開 戶成功 | app | 空 | 空 |
120988476548 | 請選擇 | app | 20160101 | 20160201 |
120988476900 | 開 戶失敗 | wap | 20160101 | 20160201 |
120988476548 | 開 戶成功 | wap | 20150101 | 20160301 |
非數字 | 開 戶成功 | 請選擇 | 20150101 | 20160201 |
空 | 開 戶成功 | pc | 空 | 空 |
120988476900 | 請選擇 | app | 20170101 | 20171101 |
120988476900 | 開 戶失敗 | 請選擇 | 20150101 | 20150101 |
空 | 請選擇 | app | 20150101 | 20160201 |
120988476548 | 開 戶失敗 | app | 20150101 | 20150101 |
120988476900 | 開 戶成功 | 請選擇 | 20150101 | 20160301 |
120988476900 | 請選擇 | pc | 20150101 | 20150301 |
120988476548 | 開 戶失敗 | 請選擇 | 20170101 | 20171101 |
120988476548 | 開 戶失敗 | wap | 20150101 | 20150301 |
空 | 請選擇 | pc | 20150101 | 20160201 |
非數字 | 請選擇 | 請選擇 | 20150101 | 20150301 |
非數字 | 開 戶成功 | pc | 20170101 | 20171101 |
四、總結
Pairwise是一種有效的測試用例生成技術,通過對測試變數的所有維度及值的組合,避免窮舉測試所有維度的所有值及其組合來減少測試用例量。
遙想當年,Cohen等人應用Pairwise測試技術對Unix中的“Sort”命令進行了測試,測試結果表明覆蓋率高達90%以上。
對於當今迭代開發測試如此高效率的時代,更需要將這種測試方法,並將其應用於測試當中。
作者:宋金剛
來源:宜信技術學院
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69918724/viewspace-2651547/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [程式設計]UML語言:理論之光與實踐之惑程式設計
- UI設計培訓之如何將設計理論與實踐相結合UI
- 高階設計總監的設計方法論——5W1H需求分析法 KANO模型分析法模型
- 錯誤推斷法、正交實驗設計法
- Tekton 設計簡介 及 實踐
- 從理論到實踐,設計一款遊戲數值架構遊戲架構
- 原型設計工具比較及實踐原型
- js正則理論與實踐JS
- DevOps 從理論到實踐指南dev
- 理解RESTful:理論與最佳實踐REST
- Flutter 自定義 Widget(理論+實踐)Flutter
- hadoop叢集搭建及程式設計實踐Hadoop程式設計
- 解析 Nebula Graph 子圖設計及實踐
- [Docker]寫 Dockerfile 的最佳實踐理論Docker
- BRDF理論及shader實現(下)
- Scala隱式轉換理論及進階實踐-Coding技術進階實戰
- 深入解析Rivest Cipher 4:理論與實踐
- 從理論到實踐 全面理解HTTP/2HTTP
- 設計模式總結(理論篇)設計模式
- State設計模式上篇(理論篇)設計模式
- 分散式設計理論之CAP分散式
- 雙目標定與三維計算:從理論到OpenCV實踐OpenCV
- 單目標定:從理論到OpenCV實踐OpenCV
- 【軟體工程理論與實踐】Homework(四.1)軟體工程
- 理論+實踐解析“IT治理”之模式與原則模式
- 從理論到實踐,Mysql查詢優化剖析MySql優化
- 密碼學與密碼安全:理論與實踐密碼學
- 理論+實踐,帶你瞭解分散式訓練分散式
- Kubernetes 叢集升級指南:從理論到實踐
- 從Monolith到微服務:理論與實踐 - Kent BeckMono微服務
- Vue微前端架構與Qiankun實踐理論指南Vue前端架構
- 理論+實踐,帶你掌握動態規劃法動態規劃
- Gradle理論與實踐四:自定義Gradle外掛Gradle
- Go程式設計實踐Go程式設計
- 關於“斯金納箱”及相關理論在遊戲設計中應用的討論遊戲設計
- Spring理論基礎-面向切面程式設計Spring程式設計
- TRIZ理論助力企業專利戰略升級:從理論到實踐的全面解析
- 評論模組 – 後端資料庫設計及功能實現後端資料庫