覆蓋表(Covering Arrays),又譯覆蓋陣列,是組合測試的重要研究領域之一,普遍應用於軟件測試、硬件測試、材料測試和測試激素相互做用對基因表達的影響。 git
軟件和硬件的測試在產品的開發過程當中扮演着重要的角色,所以軟件測試經常在軟件開發的過程當中耗費大半時間和資源[1]一般狀況下,即使是對於簡單的軟件或是硬件產品,窮舉測試也是不可行的,由於可能的測試用例的數量很是巨大。所以須要一個科學有效的測試計劃,對待測系統中各參數之間的組合進行有效的測試。這種組合測試須要一種測試用例集生成法,它能夠生成少許高質量的測試用例。 算法
根據研究代表,有百分之七十[2]的錯誤能經過測試每兩個參數之間的關係找出。出於對測試用例生成的難度、測試的成本和覆蓋強度對覆蓋表規模的影響,對任意兩個參數之間組合進行徹底覆蓋的二維覆蓋表能夠知足大部分的組合測試要求。 數組
舉個例子來講,假設咱們有一臺具備20個開關的原型機,每一個開關有"開啓"和"關閉"兩個狀態,咱們但願在定型投產以前測試這臺原型機。若是窮舉的話總共有2^20種可能,所有測試一邊顯得不切實際並且花費大。在這種狀況下咱們能夠換一種簡單一些的方式,咱們取一個全部測試用例的子集,在這個子集中任意三個開關之間的2^2種可能的組合都被測試到。這樣問題就變成了如何讓咱們須要的測試用例集最小,這個問題就是覆蓋表(Covering Arrays)問題的一個實例。 瀏覽器
依照上述實例建模能夠獲得一個CA(10::2,20,2)的覆蓋表,以下圖。(具體定義會在下文中介紹)。這個覆蓋表規模爲10,每兩列之間知足全排列。 網絡
圖1 CA(10:2,20,2) app
覆蓋表的研究已有很長時間,目前有多種求解覆蓋表的方法,啓發式搜索方法、數學方法和許多種貪心算法,但這些方法都存在各自的侷限性,並只能在解決某些特定問題時具備必定的優點。例如:TConfig[3]是一種利用正交表等基本成分進行遞歸構造的數學方法,該方法具備生成速度快的特色,但不足之處就是須要依賴已有的代數或組合對象。在啓發式搜索方面,可使用禁忌搜索和模擬退火(SA)等方法生成較小的測試用例集,但這些方法通常須要較長的時間.相比之下,啓發式貪心算法不只靈活,並且速度快,目前已經分別提出了 AETG、TCG、DDA和IPO等多種啓發式貪心方法,這些方法之間既有區別又有很大的類似性。 框架
下面簡單介紹部分貪心算法框架以外的覆蓋表生成算法。 dom
使用正交拉丁方(orthogonal Latin Squares)的方法,生成雙向的組合測試用例集。 函數
設有兩個階數相同(爲)的拉丁方陣 工具
,其中將全部放置位置相同的元素組合成一個元組,組合成一個新的矩陣
。 當這個新的矩陣
中每個元素互不相同,拉丁方陣和是互相正交的。
此時,和即爲一對正交拉丁方。 而在階數固定的狀況下,全部兩兩正交的拉丁方所成的集合稱爲正交拉丁方族。
此算法利用正交拉丁方的特性,能夠下小規模和特定狀況下快速生成覆蓋表。一樣地,此算法由於基於拉丁方的特性不夠靈活,不能應對一般狀況。
登山、模擬退火和禁忌搜索是用於求解組合優化問題的狀態空間搜索技術的變種。有一個通常的優化問題,目的是找到的解決方案是接近最優的。有許多咱們已知的解決方案,能使得咱們獲得從成本上來講最佳的結果,同時,在這些解決方案下的用例集很小。
一個優化問題能夠被指定爲可行解(或狀態)的集合Σ,以及成本C(S)對於每一個 S ∈ Σ。最優解對應於具備整體最小成本的可行解。對於每一個S ∈ Σ,咱們定義了變換集合TS,TS中的每一種變換均可以用來將S變換成另外一個可行解S'。經過從TS應用變換,能夠從S轉換出的相鄰解稱爲S的鄰域N(S)。
咱們首先隨機選擇一個初始可行解,而後生成一個隨機選擇的當前可行解的變換S。若是變換獲得一個相等或更低成本的可行解S,則S'被認爲是新的當前可行解。若是S'是更高的成本,咱們拒絕這個解決方案,並檢查另外一個隨機選擇的鄰居當前可行的解決方案。這容許咱們隨機走動,而不下降咱們當前解的優勢。登山有可能陷入局部極小(或凍結),所以須要中止啓發式。爲了增長造成一個好的解決方案的機會,咱們重複隨機遊走(或試驗)屢次,每次從隨機初始可行解開始。
在登山算法中,當前可行解是一個近似的S覆蓋陣列,其中某些T子集沒有被覆蓋。成本函數是基於未覆蓋的T子集的數目,所以覆蓋陣列自己將具備零成本。經過選擇屬於S的k個集合中的一個,而後經過不在k集合中的隨機點替換該k個集合中的隨機點來進行潛在變換。在登山試驗中,塊的數量保持不變。
咱們針對最優陣列的大小松弛的上下界,而後經過二分搜索過程在該區間中找到規模最小的覆蓋陣列。另外一種方法是從已知測試用例集的大小開始並搜索解決方案。固然,使用更少的計算資源,但必須提早知道所需的測試用例集大小。理想狀況下,在實際系統中,使用第二種的方法。
Tabu搜索經過容許當前可行的解決方案被較差的替代來進行登山。它限制使用禁忌和指定表的變化。第一是禁止被認爲缺少價值的操做,好比倒轉剛剛作的操做。其次是分配更高的權重來實現指望的性能。NurMela[4]使用Tabu搜索描述了許多成功的搜索案例。
Nurmela 和 Osterg˚ard[5],[6]採用模擬退火方法,構造了與覆蓋陣列很是類似的覆蓋設計。Stevens〔7〕、Stardom〔8〕、科恩及其同事〔9〕將模擬退火應用於覆蓋陣列的搜索。
模擬退火使用與登山相同的方法,但容許算法以受控的機率進行選擇,從而下降當前解決方案的質量。這個算法的思路就是在進行搜索的同時避免陷入壞的狀況致使卡死。若是變換獲得了較高成本的可行解S`,則在exp(−(c(S′)−c(S))/KBT)的機率下S`是能夠接受的,其中T是控制模擬的溫度,KB是一個常數。
在這個溫度下,經過在每一個溫度下經過一系列躍遷(或馬爾可夫鏈),容許系統在每一個步驟中接近"平衡"。一般這是經過設置t:=αt來完成的,其中α(控制減量)是實數小於1。在知足適當的中止條件以後,將當前可行解做爲對手頭問題的解的近似。再次,咱們經過屢次試驗來提升得到良好解決方案的機會。
另外一種啓發式搜索技術被稱爲great flood[10]或者是 great deluge[11],是threshold accepting算法的一種變種。
這些算法遵循相似於模擬退火的策略,但一般顯示更快速的收斂。當成本較高時,不使用機率來決定移動,若是成本小於當前閾值,則選擇更差的可行解。這個閾值有時被稱爲水位,在利潤最大化的問題中,水位將上升而不是降低(正如在這種狀況下發生的)。隨着算法的發展,閾值被下降,使其接近零。這些彷佛沒有探索覆蓋陣列的構造。
在啓發式搜索的領域中,遺傳算法被證實是有至關競爭力的。其基本的思路是維持一個假定的解決方案的人口,而且由兩種操做將人口從一代演變到下一代。突變使假定的解決方案中發生局部局部變化,而交叉組合了一個解決方案的一部分和另外一個解決方案的一部分。新一代的生存取決於每個新推定的解決方案的相對適合度。粗略地說,這決定了如何"接近"到所需的覆蓋數組。
待測系統(System Under Testing)是覆蓋表服務的對象,系統在此是一個泛指。假定影響SUT的參數有k個,記爲F={f1, f2, f3, …. fk},其中參數fi有ai個取值Vi = {0,1,2,3....ai-1},,1≤i≤k。
記SUT 的一條測試用例爲k 元組(v1,v2,…,vk)(viVi)。
覆蓋表是組合測試的用例集,其定義[12]以下:
待測試系統 SUT 的 t 維覆蓋表 CA(N;t,k, (v1,v2,…,vk))(或 CA(N;t,v^k),當 v1=v2=…=vk=v 時)是一個 Nk的數組,其中第 i 列對應第 i 個參數。該參數取值記爲 vi,任意 t 個參數造成的 N x t 的子數組中包含了該 t 個參數的全部 t 元組[13],其中,t 爲組合覆蓋測試的強度。本文中提到的兩兩組合測試指的是 t=2 的狀況,即利用二維覆蓋表 CA(N;2,k,(v1,v2,…,vk))進行測試。
下面咱們引入一個例子方便理解定義:
一個網絡軟件系統,它也許可讓用戶自定義多種不一樣的瀏覽器(f1),它也能夠運行在不一樣的操做系統(f2)上, 使用多種不一樣的網絡鏈接方式(f3)和打印方式(f4)。若是咱們要測試這個系統(如表2.1)咱們須要這樣子的用例:(IE,Windows,LAN,Local)、(Chrome, MacOS, PPP, Networked)。爲了測試全部可能的組合,咱們須要3^4,也就是81條測試樣例。
表1 網絡軟件系統的配置
Web Browser |
Operation System |
Connection Type |
Print Config |
IE(0) |
Windows(0) |
LAN(0) |
Local(0) |
Chrome(1) |
MacOS(1) |
PPP(1) |
Networked(1) |
FireFox(2) |
Linux(2) |
ISDN(2) |
Screen(2) |
也許這總共81條測試用例看起來能夠接受,可是若是咱們將參數的數量增長到十個的時候,咱們就總共須要測試3 ^ 10 = 59 049個測試用例。
然而,咱們能夠保證當咱們測試了全部任意兩個參數之間的全排列或是t個參數之間的全排列。在表2.2中,咱們能夠只使用9個不一樣的測試用例來覆蓋如表2.1中所示的每兩個參數之間的全排列,在最壞狀況下也能用29條測試用例來覆蓋全部對[14][15]。成對覆蓋的概念已經應用於許多學科,包括醫藥、農業和製造業[29]。
Kuhn[31]發表了了三個關於軟件系統故障的研究報告。它們代表,70%的故障能夠發現經過測試全部兩路覆蓋,而90%的故障能夠經過測試全部三路覆蓋的相互做用檢測。在這些實驗檢測的系統中,六路覆蓋檢測能夠檢測出100%的故障。美國食品安委員會(FDA)以後作過相似實驗[30],這些實驗發現,實驗涉及的109種狀況中的97%的缺陷能夠經過成對的(兩路覆蓋)參數設置測試來檢測。只有三種狀況要求覆蓋率高於成對覆蓋。
表2 網絡軟件系統測試用例集
Test No |
Web Browser |
Operation System |
Connection Type |
Memory |
1 |
IE |
Windows |
LAN |
Local |
2 |
Chrome |
MacOS |
LAN |
Networked |
3 |
IE |
MacOS |
PPP |
Screen |
4 |
FireFox |
Linux |
LAN |
Screen |
5 |
IE |
Linux |
ISDN |
Networked |
6 |
Chrome |
Linux |
PPP |
Local |
7 |
FireFox |
Windows |
PPP |
Networked |
8 |
Chrome |
Windows |
ISDN |
Screen |
9 |
FireFox |
Linux |
ISDN |
Local |
覆蓋表黑應用在不少領域中,如下是一些例子。[16]
軟件測試佔據任何軟件項目的成本的很大一部分,即使如此仍然會發生喝多故障。事實上,來自美國國家標準與技術研究所(NIST)的2002份報告報告了一個使人擔心的結論,即軟件測試不足每一年會致使$95億美圓的成本,並將大量的數據歸因於嵌入在硬件中的軟件故障[4]。Carroll[2,3]還描述了軟件測試不足的成本。近年來,許多政府機構已經開始使用更多的現成商業軟件(COTS)。許多機構和企業已在爲測試方法努力開發適當的模型,開發適當的覆蓋方法,涉及覆蓋可靠性和故障檢測,並開發自動測試生成器。此外,在測試通訊系統和存儲系統中的應用也獲得了處理。
每一個組件可能都須要單獨的測試和認證;然而,系統故障極可能是因爲意外的交互做用而產生的。若是經過集成測試能夠防止這些故障的一小部分,這可能會產生重大的經濟影響。在使用組件時,咱們最好在系統發佈以前測試組件的全部組合,然而,即便在一箇中等規模的項目中,測試全部可能的組合所需的測試用例集的大小也是使人望而卻步的。
軟件組件可能因爲異常的交互而產生系統故障。理想狀況下,人們應該測試組件的全部可能組合,但實際狀況下可能存在大量的組合。所以,成對(pairwise)或T路(t-wise)測試能夠測試固定的交互級別,在實踐中發現大量的故障。
做爲一種折衷方案,能夠應用組合設計技術來替代特定的固定級別的交互測試,即成對測試或T-WISE測試。雖然這並不能爲咱們提供徹底的覆蓋,但在交互測試中發現大量故障是成功的
如今有兩個不一樣領域正在積極研究的組合設計軟件交互測試。正如咱們所見,組合測試研究者致力於構建更高的交互強度的更小的用例集。軟件測試團體專一於貪婪搜索算法,在更靈活的框架中建模,使其更緊密地匹配實際測試需求。軟件測試人員沒法預期掌握軟件測試套件生成的每一種技術,甚至沒法肯定哪一種可用方法對它們的應用是最好的。雖然這個問題的多維建模方法被發現,但解決方案的範圍是有限的。軟件交互測試所須要的是一種有用的工具,它們經過單獨和統一地使用每種技術來構造測試套件的單1、統一的手段來處理這些技術。
在電路中,輸入信號經過算術和邏輯運算相互做用,以產生指望的輸出向量。然而,錯誤仍然可能發生。在硬件交互測試中,可使用覆蓋數組來解決這個硬件測試問題。
假設咱們要測試一個有k個輸入的電路,在電路內,輸入信號經過算術和邏輯運算相互做用,以肯定輸出向量。就像測試軟件同樣,咱們但願經過一系列的輸入向量來判斷是否有故障,故障發生在哪裏。在這種電路實驗中,每一個參數經常只有高電位和低電位兩種,根據Dumer[17]的研究,使用二維覆蓋表能夠方便測試。
有時將材料結合以產生改進的性能,如強度、柔韌性和熔點。一樣地,某些組合是有毒的或爆炸性的,必須避免。覆蓋表能夠幫助設計實驗。
Cawse[18]在他的論文中混合物實驗的實驗方案,採用CA(t,k,2)的覆蓋表來驗證混合物在不一樣環境下的物質特性。
激素影響特定基因的表達,並可能相互做用。雖然並非全部可能的激素組合均可以被檢測出來,但它是頗有趣的少許激素之間的相互做用。一樣,覆蓋表是一個很是合適的建模工具來解決這樣
貪心的中心思路就是每次選擇一條當前最優的測試樣例(是一個k元祖)加入測試用例集[19]。被加入用例集的測試用例集的用例可能從多個候選用例中選出,每一個候選用例均由一組策略生成。因爲候選用例生成策略中存在隨機值和可變參數,候選用例會有所不一樣。
假設待測系統有k個參數,每一個參數fi有Ai個可能的取值,測試用例集合爲C。
① 依照參數選擇策略選取第i個參數 //決策點1
② 若是有多個參數可選,則採用同序參數選擇策略選擇第i個參數 //決策點2
③ 給選定的第i個參數按照賦值策略賦值 //決策點3
④ 若是有多個參數可選,則採用同序賦值策略給所選的參數賦值 //決策點4
⑤ 循環步驟①~步驟④,直到全部的參數都被賦值,生成用例T //第4層
⑥ 循環步驟①~步驟⑤Candidates次,生成多個測試用例 //決策點5,第3層
⑦ 選取覆蓋未被覆蓋對最多的測試用例做爲最終的測試用例,加入集合C
⑧ 循環步驟①~步驟⑦,直到參數之間的兩兩組合都被覆蓋爲止,獲得了覆蓋表 //第2層
⑨ 反覆執行步驟①~步驟⑦Repeitition次,選擇規模最小的做爲最終結果 //第1層,決策點6
表3 6個決策點中每一個決策點的具體決策
Reputition count |
Candidate count |
Factor ordering |
Level Select |
Factor tie-breaking |
Level tie-breaking |
A Constant |
A Constant |
Uncovered pairs |
Uncovered pairs |
Uncovered pairs |
Uncovered pairs |
Random |
Random |
Random |
Random |
||
Density |
Density |
Take First |
Take First |
||
Level |
Least Using |
||||
Hybrid |
對於該策略點有如下幾種備選算法
(1)隨機選擇 (Random)
(2)和已肯定參數及待定參數的指望相關,密度聚類(Density peaks Clustering)
(3)選擇可與已肯定參數之間存在最多未被覆蓋對的參數(Uncovered Pairs)
(4)雜交策略 (Hybrid)
(5)和參數取值數目相關,按照參數取值數目降序排列 (Take First)
賦值策略的目的是所選擇的值和已肯定的值組成的對能儘量多的覆蓋未被覆蓋對。
(1)與所有未被覆蓋對的指望相關,密度聚類(Density peaks Clustering)
(2)隨機賦值
(3)和已肯定參數組合能產生最多未被覆蓋對 (Uncovered Pairs)
在參數選擇中可能會出現幾個參數有相同優先級的狀況。在遇到這種狀況時,可採用隨機選擇、按字典序以及未被覆蓋對最多的方法來打破平局。
在賦值策略中可能會出現平局的狀況。在遇到這種狀況時,可採用隨機選擇、字典序、最少使用過的值和未被覆蓋對最多的值。
由於某些決策點採用隨機選擇,每輪能夠產生幾組不一樣的用例,在其中選擇未被覆蓋對最多的加入結果集合C。根據其餘決策點決策選擇的不一樣,備選用例集的最佳數目也會不一樣。本文將對於這個決策點設計實驗,肯定一個或幾個相對優秀的常數做爲備選用例集數目。
由於某些決策點的策略是隨機的,因此屢次循環能夠獲得多組不一樣的結果,這樣得到最優解的機率會增長。然而,重複執行算法天然會增長時間成本,並且在實踐中能夠發現,當循環次數增長到必定程度時,覆蓋表規模也不會減少了。本文將對於這個決策點設計實驗,肯定一個或幾個相對優秀的常數做爲算法循環次數。
在固定的強度下,測試用例數目隨着參數數目的增長對數增加。下面咱們以強度t = 2 的狀況爲例,簡要證實對數增加。
定理3.1[19]:存在一個有k個參數的待測系統,每一個參數有L個取值。假定,如今有r條測試用例已經被肯定,未覆蓋對的數量爲N。那麼存在一條新的測試用例能夠覆蓋至少N/L^2個未覆蓋對。
證實:設有一集合
U={ (h, p) | h是一條測試用例,t是h被覆蓋的對 }
由於有k個參數,每條測試用例覆蓋k ( k – 1 ) / 2個對,因此,U中的每一個h對應k ( k – 1 ) / 2個不一樣的p。由於,每一個參數有L個取值,因此,每一個對p出如今集合U裏的L ^ ( k – 2 )個不一樣的測試用例中。
設V是U的一個子集由(h,p)構成,知足測試用例h不在已選定測試用例集r中,而且對p未被已選中測試用例集覆蓋。咱們經過兩種不一樣的方法計算Card(V)的兩種不一樣方式,賴楨敏定理3.1。
對於V中任意的(h,p),由於p未被覆蓋,因此p沒有被已選定的測試樣例覆蓋。所以,p出如今V中的L ^ ( k – 2 )條不一樣的測試用例h中。於是,若是未被覆蓋對的總數是N,那麼
Card (V) = N * L ^ ( k – 2 )
對於每一個位被選中的測試用例h,設mh是被h新覆蓋的對的數量。若h是已選定集r中的某一條,那麼mh的值爲零。則h在V中出現mh次,所以
Card (V) = SUMh (mh)
如今令m爲mh中的最大值,爲了證實定理咱們必需要證實m至少爲N/L^2。由於可選測試用例的總數是L ^ k,咱們就能夠獲得如下不等式。
Card (V) = SUMh (mh) <= m * L ^ 2
所以,N * L ^ ( k - 2 ) <= m * L ^ k,即
N / L ^ 2 <= m
咱們已經經過上述步驟證實了定理3.1,那麼在算法過程當中確定存在一條測試用例覆蓋1 / L ^ 2個剩餘對。現設貪心算法選擇每條測試用例時覆蓋了儘量多的未被覆蓋對,N是初始時的爲被覆蓋對數量,由於存在k個參數,每一個參數有L個取值,那麼N = k ( k – 1 ) / 2 * L ^ 2。使用貪心算法當r條測試用例已經被選定以後,剩下的待覆蓋對的數量是
N' <= N * (1 – 1 / L ^ 2 ) ^ r
所以,若是r > - log (N) / log ( 1 – 1 / L ^ 2 )則N' < 1那麼全部的對都已經被覆蓋,
使用近似法log(1 – 1 / L ^ 2) = -1 / L ^ 2,由此咱們能夠推導當貪心算法覆蓋全部未覆蓋對時,
r > L ^ 2 * log(N) >= L ^ 2 * ( log(k ( k – 1 ) / 2) + 2 log(L) )
上述證實代表貪心算法所須要生成的測試樣例個數隨着k的增大而對數增加,而且和L的二次方正相關。[26]
AETG[19][20][21]算法是已有的一種覆蓋表生成貪心算法,其組合是(hybrid,uncovered pairs,—,uncovered pairs,—,50)。在AETG中的同序參數選擇策略和算法循環次數能夠隨意指定。AETG參數選擇策略採起的是雜交策略,第一個參數選擇了未覆蓋對最多的參數,其他參數隨機排序。
假設待測系統有k個參數,每一個參數有v個值。如今咱們選擇了r個測試樣例以後,當咱們在選擇第r + 1測試樣例時,首先生成CandidateCount個不一樣的候選用例,而後從中選擇一個覆蓋最多未被覆蓋對的測試用例。每一個候選測試用例由如下貪心算法選擇:
1. 選擇一個參數f,這個參數的一個值L在當前未被覆蓋對中出現的頻率最高。將參數f賦值爲L。
2. 令f1 = f,並將剩下的參數亂序排列加入待賦值隊列。
3.假設f1到fj已經被賦值,對於1 <= i <= j ,令fi的賦值爲vi,而後用以下方法爲fj+1選擇賦值vj+1。vj+1在全部可選值中與已經賦值的參數組成的未覆蓋對最多。
因爲候選測試用例依賴於在步驟2中選擇的隨機順序,使用不一樣的隨機種子能夠產生不一樣的測試集。一個有效的優化是使用50個不一樣的隨機種子生成50個不一樣的測試集,而後選擇其中最優的。這樣有概率將生成的測試的數量減小十到百分之二十,也有肯定性的構造和可替代的隨機算法[25],有時生成更少的測試用例。
DDA[22][23]算法也是目前已有的一種貪心算法,在貪心算法框架下的組合是( density, density, take first, take first, 1, 1 )DDA給全部參數定義了一個密度值,其中沒有隨機策略,所以DDA是一種肯定性算法。
DDA算法的重點在於Density策略的實現,使用密度公式計算未被覆蓋對數量的指望。在此以前咱們先作一些定義,將當前計算參數的密度定義爲E,r(i,j) 當前參數i和另外一個參數j以前的未覆蓋對數目,定義λ爲兩參數之間的對數總數。E的計算方法爲:
1. 若是兩個參數之間存在多個未被覆蓋對則
E = ( r(i,j) / λ ^ 2 )
2. 若是隻有一個參數有一個取值另外一個參數有多個取值之間存在未被覆蓋對,則
E = (r(i,j) / λ ) ^ 2
3. 若是兩個參數都只有一個可選賦值,若這兩個值組成的對被覆蓋則E = 1.0,不然E = 0.0。
TCG[24]與AETG接近,其差別在於它的參數選擇策略與AETG的參數選擇策略不一樣。參數按照參數課選擇數目降序排列。值選擇策略採用的是雜交策略。