本文章是由機器翻譯。

測試回合

擴散測試

詹姆斯 McCaffrey

下載程式碼範例

在本月的專欄中,我將介紹您的軟體測試技術來我稱之為擴散測試。擴散測試的重要概念是它有時可能是自動產生新的測試案例資料從現有的測試案例會產生成功 」 的結果。

雖然擴散測試是一種技術,並不適用在大多數的軟體測試情況下,當擴散測試 適用時,它可以大幅提升您的測試工作的效率。部分可能是因為它是專門技術,擴散測試是最已知其中一項測試的所有主要的 [我的經驗為基礎的技術。

我提出的擴散測試範例之前,且聽我分曉方法背後的動機。測試案例通常會包括測試案例識別碼,一組一或多個輸入和預期的結果。例如,向量 {001、 2、 3,5} 無法代表 Sum 函數,測試案例,識別碼 = 001,輸入 = 2 和 3 與預期的結果 = 5。測試案例輸入傳送到受測試,系統會產生實際結果及實際結果相較於預期的結果,以判斷測試案例通過/失敗結果。

在許多軟體測試情況下很困難且花時間來決定測試案例的預期的結果部份。例如,假設您正在測試的基本數學函式,會計算兩個輸入速率的調和平均數。為每小時 (kph) 和 60.0 kph 的 30.0 公里的平均值是 (30.0 + 60.0) / 2 = 45.0 kph,但而是調和平均數的 30.0 和 60.0,也就是 1 / ((1/30.0 + 1/60.0) / 2) = 40.0 kph。產生數百個預期的結果,這個函式可能會讓人心煩氣躁,需要花費大量時間而且是容易發生錯誤。

決定預期的測試案例結果的困難度是軟體測試的基本概念,有時也稱為測試 oracle 問題。事實上,其中一個的軟體測試神聖的 grails 是搜尋目標] 可以自動判斷測試案例的技術。因此,如果您可以某種方式自動產生新的測試案例資料,請將 sidestep 耗時測試程序的一部分,能夠更徹底測試您的系統背後擴散測試的動機。

自動產生使用擴散測試的測試案例資料是原則,因為太棒了,但是它如何運作?說明擴散測試的最佳方法是範例的形式。請看一下 圖 1

圖 1 測試示範擴散

在此,我在測試應該函式,而 Choose(n,k),它會傳回許多方法可從 n 個項目選取 k 項目順序不重要。在我簡化的範例中,我有三個現有的測試案例。第一個測試案例已輸入 n = 8 和 k = 3 和預期的結果為 56。我的測試控管執行產生如果成功,第一個測試案例後我使用擴散測試,以自動產生新的測試案例,以輸入 n = 9 k = 3 和預期的結果 84。簡潔吧 !請注意因為測試案例 002 產生失敗的結果,我並沒有產生新的 diffused 的測試案例。

但是如何新測試案例產生從現有的測試案例?Choose(n,k) 函式,其實,以數學方式,Choose(n+1,k) = Choose(n,k) * (n + 1) / (n-k + 1)。換句話說,新的輸入之間沒有已知的關聯性和舊傳回值。我用來從現有的測試案例產生 diffused 的測試案例的函式所示 圖 2。產生所示的輸出的整個程式 圖 1 會在 code.msdn.microsoft.com/mag201103TestRun.

圖 2 產生新的測試案例

static string CreateDiffusedTestCase(string existingTestCase)

{

  // Assumes input format is CaseID:N:K:Expected

  string[] tokens = existingTestCase.Split(':');



  string oldTestCase = tokens[0];

  int oldN = int.Parse(tokens[1]);

  int oldK = int.Parse(tokens[2]);

  long oldExpected = long.Parse(tokens[3]);



  string newTestCase = oldTestCase + "-diffused";

  int newN = oldN + 1;

  int newK = oldK;

  long newExpected = (oldExpected * (oldN + 1)) / (oldN - oldK + 1);



  return newTestCase + ":" + newN + ":" + newK + ":" + newExpected;

}

有幾個額外的範例可能有助於讓更清楚這個概念。假設您正在測試的計算的三角正弦函數和餘弦值的函式。您可能重新叫用該 sin 2t = 2 * sin t * cos t。因此如果您有產生正弦值和某些輸入的餘弦值的階段結果的測試案例,您可以使用擴散測試來衍生新的測試案例的正弦函數。

擴散測試不魔法。假設您正在測試的接受某些排序的產品識別碼的函式會搜尋 SQL 資料庫,並傳回 「 產品 」 內建和 false 如果產品不庫存單位數量,則為 true。因為不同的輸出與結果之間沒有關係,所以您無法使用擴散測試在這個案例中。在這方面擴散測試會類似於其他形式的測試界限條件測試和配對測試:它是一種技術,只適用於某些情況。

我要呈現的擴散測試另一個範例。假設您已寫在函式,而 Gauss(z),可接受的標準一般 z 值和負的無限值從傳回標準常態 (鐘型曲線) 分配下方區域到 z。例如,Gauss(-1.645) = 0.0500,Gauss(1.645) = 0.9500 和 Gauss(0) = 0.5000。其中一個方法使用擴散測試是注意電磁槍的 monotonic 屬性,該範圍中任何 z 值負的無限值 2.5,電磁槍的結果 (z + 0.1) 必須大於 Gauss(z)。使用擴散測試的另一種方法是請注意電磁槍對稱屬性且任何 z 值是小於 0.0,Gauss(-z) = 1.0-Gauss(z)。

我在提供的範例說明最常見的三個,但不是唯一 — 其中擴散測試是適用的案例。第一個案例是您正在測試可以定義為循環關聯性的數學函式的位置。第二個案例是您正在測試的函式有一些 monotonic 的關聯性的位置。和第三個案例是您要在其中測試這個函式具有某些對稱的關聯性。為關聯的表單的測試,但那不是擴散測試,是當您正在測試的函式位置切換輸入值的順序並不會變更傳回值,例如以 Sum(x,y)。

數學函式是最常見的元件可以受益於擴散測試的測試類型,因為這類函式通常是循環性、 monotonic 或對稱 — 但是您也應該要其他情況下,警示。涉及循環關係的數學函式是特別適用於擴散測試工作,因為您通常可以從現有的測試案例產生多個新的測試案例。在示範在 圖 1,測試案例 001 n = 8 k = 3 和預期 = 56 產生新 diffused n 的測試案例 = 9,k = 3 和預期 = 84。這個新的測試案例無法用來產生其他的測試案例,以 n = 10、 k = 3,預期 = 120,而且如果傳遞該測試案例,它可以用來產生但另一個新的測試案例,如此類推。

我結論之前,讓我快跳上我的 soapbox 和解決我寵物 peeve 相命名不同的軟體測試技術和原則。我已標示為擴散測試工作,因為現有的測試案例擴散,在本專欄中所述的技巧或散佈圖,若要建立新的情況。我無法也稱為技術調整測試或自動產生測試或任何數目的其他項目。這不是很重要,標籤,但是,所計算的標籤表示的技術而是。

在許多欄位中的研究,包括軟體測試,self-proclaimed 的專家將某些標籤套用至基本常識技術,隱含地嘗試說服使用者新增到欄位標籤本身某種方式具有某些重要性。這通常是說明促成所想要直接出售訓練或間接賣出諮詢服務藉由在這個新的標籤上會議傳遞 a 與交談。值得注意可能違反的是這些條款 」 探勘測"和"內容學校的測試,",但還有許多其他。因此需要的是什麼時間的詞彙"擴散測試 」 — 只要的標籤來描述軟體測試技術為何,但是其中一種可能會有用外加技術的工具組。

Dr. James McCaffrey* 適用於 Volt 資訊科學 Inc.,他用來管理技術訓練軟體工程師使用 Microsoft 里德蒙,Wash.,在校園。 Dr。McCaffrey 是的作者 」。NET 測試自動化食譜 」 (Apress,2006年,) 及可以連絡到在  jammc@microsoft.com.*

多虧了要對下列技術專家,來檢閱這份文件:Bj RollisonAlan Page