如何用組合提高軟件測試用例的生成
測試一直是軟件開發過程中的一個重要過程,而三個因素使得它扮演了更重要的角色。首先,微軟.Net的環境已經顯著地提高了程序員編寫自定義自動化測試的能力,以前需要兩周時間創建的測試項目,現在在.Net Framework下只用幾個小時便可完成。第二,程序和系統越趨于復雜,所需的測試就越精密。最后,軟件安全性已不再是程序開發最后才考慮的問題,它是絕對必要的。在以前有可能存在一款軟件沒有經過完整的測試就已向外發布的情況,但如今這已不再可行。為了幫助你滿足現今的測試挑戰,我將在這個欄目里每隔幾個月就向你展示軟件測試的最佳方法、原則和技術。
這個月我將從組合在軟件測試中的角色開始說起。編程產生組合的能力,能夠為你的測試用例輸出提供強有力的方法。首先我談談我所說的組合的意思:如果你現在正在寫一個撲克牌的程序,需要你手動輸入5張牌牌型的所有可能情況,你一定不會樂意。但如果你用這個欄目里的代碼來處理,你將能夠在幾分鐘內做好這件事:
組合
數學組合的三個基本操作如 Figure 2 所示。輸出告訴你當 n = 4,k = 2 時,有六種組合:
{ 0, 1 } { 1, 2 }
{ 0, 2 } { 1, 3 }
{ 0, 3 } { 2, 3 }
從這個例子你可以看到我需要建立某種組合,給定條目總數和子集大小來計算全部組合元素的總數,并且確定某個特定組合元素的后繼者以便我能列出所有組合元素。
Combination c = new Combination(52,5); // 52 cards, 5 at a time
string[] pokerHand = new string[5];
while (c != null)
{
pokerHand = c.ApplyTo(deck);
PrintHand(pokerHand);
c = c.Successor();
}
在大量的自動化測試方案中,你一旦學習并認識了組合,你會發現它驚人的有用。再舉一個例子,假如你正在測試某個系統,要用戶從文本框接收用戶傳入的10個字符。用戶可能會輸入"ABCDEFGHIJ",或者是")(*&^%$#@!",你想知道共有多少種測試的用例。假定你要求輸入字符的可選類型等于20種(這可能根據系統要求的不同而不同,比如從大寫的'A'到'Z',或者是從0到9等等)。
要特別強調的是,你必須從20個不同的字符中一次性選取10個,即Choose(20,10)——這個函數我會在稍后解釋。請注意,這里我其實簡化了問題。實際上,你可能還需要考慮每個邊界條件和其他測試概念的排列組合。
現在,我將會創建一個C#語言寫的的組合類,并向你展示怎樣用組合來提高測試的性能。我想你一定會認為理解并運用組合及其相關的理論是有價值的。
圖1 Combinations Demo
貼上截圖是讓你能夠跟上我思路的最好方式。圖1是一個Windows@-based 應用程序的截圖,它演示了組合的應用。正如你所看見的,組合就是一組元素的無序子集。在這個例子中我們有5個元素——Adam,Barb,Carl,Dave和Eric——我只對3個元素的組合感興趣。從5個元素中一次性選出3個,共有10種不同組合:
注意,無序子集的意思是,{Carl,Barb,Adam}和{Adam,Barb,Carl}是等價的,兩者都代表同一個子集。圖1還說明了一點,在用給定的元素集合大小和子集大小生成組合時,我們還需要計算出不同組合的總數。
數學中組合的定義是:n是從整數0到n-1的集合,從4個元素的集合中一次選取2個的6種組合即是:
{ 0, 2 } { 1, 3 }
{ 0, 3 } { 2, 3 }
正如我之前所說,組合在軟件測試、開發、管理等各種領域中都有著很大的作用。組合在數學領域中是古典而又深刻的,但我發現有很多程序員對它的理解都不夠徹底,現有網絡中的一些與組合相關的代碼不是寫錯了,就是執行效率低下。
組合在規劃和執行配置的測試中有著不可替代的作用,特別是在一些互動分析的分支領域。假如你需要在一臺機器上測試多種瀏覽器和媒體播放器來安裝你的產品,你想要你的系統從8種瀏覽器中選擇3種安裝,并從6個媒體播放器中選擇2個安裝,一共有多少種可能的配置?你能否用程序列舉出所有的配置?本文的程序能夠讓你輕松得到結果:Choose(8,3)*Choose(6,2)=840,并且你可以列舉出所有的組合類型。
組合在檢查和測試執行路徑時很有用。 我講一個經典的執行路徑分析的例子(這類問題經常在微軟面試軟件測試工程師時出現)。假設你正在開發一個游戲,玩家從有瓷磚地板的西南角房間進入,他們必須移動到房間的東北角,而要移動過去,必須通過把瓷磚向東或向北移動(換句話說,玩家必須移動向他們要去的方向,而不能回頭)。如果房間很小——只有10個瓷磚能水平移動,6個瓷磚能豎直移動——共有多少種路徑可供玩家選擇?你能夠列舉出所有正確路徑么?假定向東移動用英文字母E表示,向北用N,一種可能的路徑是,先向東走到頭,再向北走到頭:
還有一種不同的走法:
顯然,無論玩家怎么走,他都只會走16步,而且走的方式只有“E”和“非E”兩種。你可以在腦海中構造一個16個連續的空格,你必須要在這16個空格中填充入10個“E”(因為剩下的必須填“N”)。所以,這個問題的答案便是Choose(16,10)=8080種可能的路徑,你可以通過本片的代碼輕松得到結果。
正如我之前所說,測試在軟件開發中具有非常重要的作用,跟著我一起,你可以把這些優化加入在你的測試過程中。
文章來源于領測軟件測試網 http://www.kjueaiud.com/