本文章是由機器翻譯。

測試回合

部分 Antirandom 字串測試

James McCaffrey

下載範例程式碼

antirandom (衝鋒槍) 測試是一種純隨機測試,即產生隨機的輸入和輸入傳送至受測試系統的程序。在大多數的情況下隨機測試輸入沒有一個關聯明確預期傳回值或系統狀態。在這類的情況下隨機測試的目的是嘗試產生系統失敗的一些排序,例如擱置或損毀。研究研究顯示純粹隨機測試是相對較有效率地發現 Bug 比其他測試的範例如等價磁碟分割測試和界限值分析測試。但是,隨機測試為吸引人,因為是通常快速且容易實作。硬體測試的欄位有被引入似乎衝鋒槍測試的概念。基本上,衝鋒槍測試會產生一組輸入的值的情況,彼此為不同的隨機值。假設前題是類似的輸入,系統會公開類似的錯誤,類型,因此包含彼此非常不同的值的輸入的集合有公開錯誤軟體系統中的一個更高可能性。


圖 1 產生部分衝鋒槍字串

以下是範例。假設硬體系統有一個接受 3 位元值的參數。完整的輸入的網域因此,有八個值:{000, 001, 010, 011, 100, 101, 110, 111}.進一步,假設您想要產生一種測試組,包含四個衝鋒槍輸入因為徹底測試的所有八個值是不可行基於某些原因。初始衝鋒槍測試設定沒有並值 {0,0,0} 可以是任意選取從輸入的網域加到測試集合。下一個輸入来加入至衝鋒槍測試將會是從網域空間的最不同測試集合中目前的值的值。值 {1,1,1} 在這種情況下是最不同 {0,0,0} 使用的不同,幾乎任何合理的定義,所以現在設定衝鋒槍測試包含 {0,0,0} 和 {1,1,1}。下一步],假設已選取 [值 {0,0,1} 從輸入網域使用如下所述,和加入至設定,讓您設定現在包含 {0,0,0}、 {1,1,1} 和 {0,0,1} 衝鋒槍測試程序。任何輸入的網域中剩餘的五個值是適合的測試將第四個和最後一個成員。但是,選擇的值並完全視使用差異函式而定。一個候選函式是 Hamming 距離也就是只要中兩個數值位元的不同位置的位置數目的兩個值之間。每個候選值和三個衝鋒槍測試集的目前成員之間的 Hamming 距離的總和是:

010: 1 + 2 + 2 = 5
011: 2 + 1 + 1 = 4
100: 1 + 2 + 2 = 5
101: 2 + 1 + 1 = 4
110: 2 + 1 + 3 = 6

因為 {1,1,0} 是最不同於衝鋒槍測試集合的現有的成員,會加入至測試集。本範例指出純衝鋒槍測試輸入的產生需要整個輸入的網域中的一個完成列舉型別。這可能是硬體的可能針對特定類型的測試具有相對較小的輸入位元大小或軟體的小輸入網域的系統。但是,純衝鋒槍測試是複雜的軟體系統很少可能的。此資料行提供一個方法呼叫部分衝鋒槍字串測試,可以用來測試範圍廣泛的軟體系統。

說明,我向最佳方法是使用兩個螢幕擷取畫面。圖 1 顯示如何產生部分衝鋒槍字串測試集合的範例。

圖 1] 所示的範例根據一些七卡玩系統而定。每個字串代表七個卡,其中有 '一'代表一個從 a ;' T' '表示 10 ;'c' 想和 '、 'h'和的 '代表俱樂部]、 [菱形控點]、 [傷心小棧] 及 [西式拱豬。如果允許重複的項目,輸入字串總數目會是 52 第七個乘冪數 = 1,028,071,702,528,這很可能是在大部分的測試情況下無法管理。衝鋒槍測試設定的產生開始藉由建立代理輸入的網域,是隨機選取整個輸入網域的子集合。在此我使用 10 個字串的手動小型的 Surrogate 網域大小,來保持範例的簡潔。衝鋒槍測試集大小設定為 3,供示範之用一次手動小。衝鋒槍測試集合是一開始是空 ;第一個字串代理的 「 Ts Th 3 h Qd Kd 4d 9 d",網域中的值會加入至 [衝鋒槍設定。接下來,示範程式會檢查字串代理網域尋找最不同衝鋒槍集合中單一的字串,字串中的每個。此時字串"3 c 9 h 9s 3s 為 9 c 2 c"選取了作為最不同。我會說明如何差異計算短時間內執行。接下來,示範程式重新掃瞄代理網域來找出最不同於這兩個衝鋒槍測試集合中,目前兩個字串的字串值。之後的最終值,9 d Js Js Kd 7 h 5d Jc,是決定加入衝鋒槍集合,示範程式會顯示最後的組。結果是測試輸入一組包含更多不同的每個會是大小寫,如果字串已被隨機選擇非字串。


字串,[圖 2 測試與部份衝鋒槍

圖 3 結構的部分衝鋒槍測試設定產生

using System;
namespace Demo
{
class Program
{
static Random r = new Random(0);
static void Main(string[] args)
{
try
{
Console.WriteLine(
"\nBegin partial antirandom string generation demo”);
long domainSize = (long)Math.Pow(52, 7); // 1,028,071,702,528
int surrogateDomainSize = 8;
int antiRandomTestSetSize = 3;
// display sizes of input domain, surrogate domain,
antirandom test set
// initialize and display surrogate domain
// create partial antirandom test set
// display partial antirandom test set
}
catch (Exception ex)
{
Console.WriteLine("Fatal: " + ex.Message);
Console.ReadLine();
}
} // Main()
} // class
} // ns

螢幕擷取畫面的圖 2 顯示的部分衝鋒槍字串可以用來測試系統的方法之一。 我在測試假設 PokerLib.dll 模組可接受字串,表示稍早所述的七個卡玩手的形狀。 其概念是重複產生部分衝鋒槍測試集,並傳送每個測試中的所有字串值都設定為受測試系統。 在此的情況下,我強制任意最大數目的循環的 1,000,000。 圖 2] 所示示範使用代理輸入的大小為 100,並部分衝鋒槍測試設定為 10 的大小。 我撰寫程式碼假設 PokerLib.dll 系統測試,來快速產生例外來示範您希望執行部分衝鋒槍測試,即產生錯誤時的動作。

在此的資料行中我使用詞彙衝鋒槍測試、 部分衝鋒槍測試,和更多或更少交換測試的部分衝鋒槍字串。 但是,在學術研究文獻,衝鋒槍測試通常是參照到我所述的輸入的值二進位,而整個輸入的網域掃描來決定處理程序中 [衝鋒槍值測試設定。 使用部分 」 一詞來區分說明的技巧這裡的掃描一個從純粹 」 的代理網域衝鋒槍測試。

在各 「 節我會呈現,並說明程式碼產生顯示在 目錄 12 和螢幕擷取畫面。 在就特別我將說明不同的技術,可以讓您判斷兩個字串之間,以及每個技術適當時的差異。 我也會顯示一些指導方針如何選取代理網域大小,並衝鋒槍測試設定大小。 我假設有開頭到中繼層級的程式設計技能。 我的範例使用 C# 程式碼,但您應該可以輕鬆地 recast 成包括 VB.NET]、 [Java]、 [Perl] 和 [PowerShell 的其他語言的 [我的程式碼。 我確信您會發現部分衝鋒槍測試一個有趣的主題,並且能夠測試系統使用部分衝鋒槍字串可以是您測試的工具套件有價值的除了。

產生部分衝鋒槍字串

圖 3] 中的程式碼是產生螢幕擷取畫面的圖 1] 所示之程式的整體結構。

我會建立名為示範使用 Visual Studio 2008 C# 主控台應用程式專案。 我的部分衝鋒槍產生不使用任何特殊 .NET Framework 命名空間,刪除使用陳述式除了參考根 System 命名空間的自動產生。 我會產生隨機物件使用種子值為 0:

static Random r = new Random(0);

我提供隨機建構函式的識別值種子值而非使用預設建構函式沒有一個值的種子,使我的輸出會重現。 清晰度] 和 [簡單],在此資料行使用隨機 」 一詞而更精確 「 虛擬隨機的]。之後顯示開始訊息,我會使用 Math.Pow() 方法來計算字串在測試案例中,輸入網域中的總數。 技術上,我不需要這項資訊,但是它用來指出測試部分衝鋒槍字串是通常很有用的情況下有太多輸入要徹底測試。 在此的情況下輸入的字串代表手的形狀的七個卡,而表單 」 rs rs rs rs rs rs rs 」,其中 R 是 13 的陣序規範值的其中一個 ("A","T","2 到 9","J","問:""K") 和"s"是的四個花色值 ("c"、"d"、"h"、"s")。 每張卡可以是 13 * 4 = 52 的其中一個可能性,並因此與重複項目允許的可能字串總數是 52 第七個乘冪數。

圖 4 產生隨機卡字串

public static string MakeARandomCard()
{
string answer = "";
int rank = r.Next(1, 14); // 1-13
int suit = r.Next(1, 5); // 1-4
if (rank == 1) answer += "A";
else if (rank == 10) answer += "T";
else if (rank == 11) answer += "J";
else if (rank == 12) answer += "Q";
else if (rank == 13) answer += "K";
else answer += rank.ToString(); // 2 thru 9
if (suit == 1) answer += "c";
else if (suit == 2) answer += "d";
else if (suit == 3) answer += "h";
else answer += "s";
return answer;
}

接下來,我設定代理網域及分別設定為 8 和三個,測試的大小。 這些大小會比您通常會使用在實際執行環境中的小很多。 我將探討稍後選擇這些大小的問題。 我是藉由呼叫 Helper 方法命名 MakeARandomDomainString() 初始化代理網域:

Console.WriteLine("\nGenerating surrogate domain");
for (int i = 0; i < surrogateDomain.Length; ++i)
  surrogateDomain[i] = MakeARandomDomainString();

協助程式方法的程式碼是:

public static string MakeARandomDomainString()
{
  string answer = "";
  for (int c = 0; c < 6; ++c) // first 6 cards
    answer += MakeARandomCard() + " ";
  
  answer += MakeARandomCard(); // last card, no trailing space
  return answer;
}

使用 [測試的部分衝鋒槍時每個測試案例將會具有不同的輸入的字串格式。 在一個極端的情況,您可能沒有長度以外的輸入的字串格式的條件約束。 在這類的情況下,您必須只產生完全隨機的字串。 在我的範例中,我有組織完善的格式。 在就一般可用性測試增加為輸入的結構的部分衝鋒槍字串的字串會增加。 MakeARandomDomainString() 方法只會產生字串,表示交互呼叫 Helper 方法 MakeARandomCard(),的圖 4] 所示的七個卡。

使用隨機物件我稍早產生來產生兩個 [1,13] 範圍中的虛擬隨機整數和 [1,4],分別。 請注意兩個參數至 Random.Next() 方法代表內含下限和獨佔上限讓 r.Next(1,14) 會產生一個隨機整數一個與 13 之間 (含) 之間,而非一個到 14 之間。 我可以使用多載的 + = 運算子來建立我的卡片字串,而非 System.Text 命名空間的效率 StringBuilder 類別。 在此的文件我使用一般的程式設計技術,使您可以更輕鬆地重整我的範例程式碼到其他程式語言。 此外,我有撰寫程式碼使用傳統非-OOP 樣式,以便您可以輕鬆地重整指令碼語言,例如 JavaScript 和 Perl 的有限 OOP 支援我的範例。

建立代理網域後, 我要顯示它:

Console.WriteLine("\nThe surrogate domain is: \n");
for (int i = 0; i < surrogateDomain.Length; ++i)
  Console.WriteLine("[" + i + "] " + surrogateDomain[i]);

在這個範例中,我不要檢查代理網域中的重複值。 在就一般工作,才能避免重複代理網域中的項目非常太來左右對齊獲得好處。 還記得隨機測試技術的主要的訴求範圍是簡單。 此外,我們很快就會看到,代理網域中重複的值是高度不太可能會放入衝鋒槍測試集合。 現在我準備好要產生部分衝鋒槍測試集合。 [圖 5] 中的程式碼顯示如何完成這項。 選取 [代理網域中的 [第一個值,並將它放入衝鋒槍測試將開始:

Console.WriteLine("Adding " + surrogateDomain[0] + " to AR test set");
antiRandomTestSet[0] = surrogateDomain[0];
int numberValuesInTestSet = 1;

因為代理網域中的字串會產生隨機,在大多數的情況下利用中選取特定的字串。 我可以使用變數的 numberValuesInTestSet 來追蹤多少字串目前衝鋒槍測試中設定。

圖 5 產生部分衝鋒槍測試的程式碼設定

for (int k = 1; k < antiRandomTestSet.Length; ++k) {
int largestTotalDeltaForAllI = 0;
int indexOfBestCandidate = 0;
int totalDeltaForCurrentI = 0;
for (int i = 0; i < surrogateDomain.Length; ++i) {
totalDeltaForCurrentI = 0;
for (int j = 0; j < numberValuesInTestSet; ++j) {
totalDeltaForCurrentI +=
RotateDistance(surrogateDomain[i], antiRandomTestSet[j]);
} // j
if (totalDeltaForCurrentI > largestTotalDeltaForAllI) {
largestTotalDeltaForAllI = totalDeltaForCurrentI;
indexOfBestCandidate = i;
}
} // i
Console.WriteLine("\nDetermining antirandom value: [" + k + "]");
Console.WriteLine(
"String at [" + indexOfBestCandidate + "] in surrogate domain");
Console.WriteLine(
"is most different from strings curently in AR test set");
Console.WriteLine(“Adding " + surrogateDomain[indexOfBestCandidate] +
" to AR test set");
antiRandomTestSet[numberValuesInTestSet++] =
surrogateDomain[indexOfBestCandidate];
} // k

最外層的迴圈使用索引變數 k 用來插入點,並填入衝鋒槍測試集合中的每個儲存格。 啟動值 k = 1,因為我植入衝鋒槍測試代理網域中設定第一個值索引 0 中的第一個儲存格。 因為目標是要在與目前衝鋒槍測試集合中的所有字串最不同代理網域中找到字串,我會建立變數 largestTotalDeltaForAllI 追蹤值,表示找到最大的差異。 我也會初始化一個變數 indexOfBestCandidate 代理網域中以最大的差異值,在字串所在的資料錄。

圖 6 的 Levenshtein 距離

public static int LevenshteinDistance(string s, string t) // assume s, t
not null
{
int[,] dist = new int[s.Length + 1, t.Length + 1]; // distance
int subCost; // substitution cost
if (s.Length == 0) return t.Length;
if (t.Length == 0) return s.Length;
for (int i = 0; i <= s.Length; ++i)
dist[i,0] = i;
for (int j = 0; j <= t.Length; ++j)
dist[0,j] = j;
for (int i = 1; i <= s.Length; i++) {
for (int j = 1; j <= t.Length; j++) {
if (t[j-1] == s[i-1])
subCost = 0;
else
subCost = 1;
int temp = Math.Min(dist[i - 1, j] + 1, dist[i, j - 1] + 1);
dist[i, j] = Math.Min(temp, dist[i - 1, j - 1] + subCost);
}
}
return dist[s.Length, t.Length];
}

迴圈使用索引變數 i 的下一個逐一查看代理網域中每個候選字串。 之後初始化為 0 將變數 totalDeltaForCurrentI,我使用巢狀 For 迴圈索引變數 j 來擷取衝鋒槍測試集合中的目前字串的每個。 因此,在此時索引 k (和變數 numberValuesInTestSet) 指向衝鋒槍測試集合中, 下一個空白儲存格索引 i 指到代理的網域候選字串,索引 j 指向目前字串中 [衝鋒槍測試設定。 現在我決定在由 i 和 j 所指到兩個字串之間的差異,並累積目前的候選字串的執行總代理網域中的差異:

totalDeltaForCurrentI +=
RotateDistance(surrogateDomain[i], antiRandomTestSet[j]);

RotateDistance() Helper 方法呼叫務必,並我就會馬上討論它。 如果候選字串和衝鋒槍測試集合中的所有字串之間的距離的總和大於我目前的最大加總的距離值,我會更新我的追蹤變數:

if (totalDeltaForCurrentI > largestTotalDeltaForAllI) {
largestTotalDeltaForAllI = totalDeltaForCurrentI;
indexOfBestCandidate = i;
}

回收部分衝鋒槍字串測試的重點是要產生盡可能彼此為不同的字串。 在列印到命令殼層一些進度訊息後, 我新增在代理網域衝鋒槍測試設定與更新測試集合中的值數目的最佳候選找到:

antiRandomTestSet[numberValuesInTestSet++] =
  surrogateDomain[indexOfBestCandidate];

因為索引 k 和變數 numberValuesInTestSet 保留相同的值,我可以取代此處 k。 但是,更具敘述性變數的使用,是在我看來有點更容易閱讀。

計算兩個字串之間的差異

當執行測試的部分衝鋒槍字串,您會需要的方法,會計算兩個字串之間的差異。 您比較兩個字串,將視您的測試案例中使用字串的格式。 如果一定會進行比較的字串有相同的長度,一個簡單的可能性,是使用字元為基礎 Hamming 距離,即只的位置,其中一個字串中字元的不同位置數目。 就例如如果 s = car和 t ="bag"Hamming 距離 s 和 t 是兩個。 如果您兩個字串擁有不同的長度,您可以使用修改過的 Hamming 距離將較長的字串與較短的字串之差異的大小。 例如如果 s = car和 t = 纜"線 」,修改過的 Hamming 距離是 (針對 'r'對。' b ') + 2 ('l'與 'e') = 3。 以下是一種方式實作 Hamming 距離相同大小的字串:

public static int HammingDistance(string s, string t)
{
  if (s.Length != t.Length)
    throw new Exception("s and t must have same length in
      HammingDistance()");
  int ct = 0;
  for (int i = 0; i < s.Length; ++i)
    if (s[i] != t[i])
      ++ct;
  return ct;
}

兩個字串之間差異的另一個簡單的量值就是字元為基礎的笛卡兒距離。 這就像您可能會從最高學校代數記得的兩個點幾何的距離。 假設字串 s ="bat"和 t = car。 「 b 」 的 ASCII 值98 和 ASCII 值 'c'99,並因此兩個字元不同的是其中一個。 ' t' 差異 '與 'r'是兩個。 字元為基礎笛卡兒距離字串 s 和 t 是 sqrt(1^2 + 0^2 + 2^2) = 2.24。 更多的方法來計算兩個字串之間的差異是 Levenshtein 距離。 兩個字串 Levenshtein 距離是字元插入、 刪除和轉換到另一個字串所需的替代最小數目。 Levenshtein 距離是一個有趣的主題,在它自己的權限,但它的完整討論這份文件的範圍之外。 圖 6 列出您可以用來測試部分衝鋒槍字串 Levenshtein 距離的簡單的實作。

多結構化您輸入的字串是,更有可能是自訂的差異的方法會比一般的差異] 方法如 Hamming 距離] 或 [Levenshtein 距離更有用。 例如,如果在我的玩卡案例請仔細考慮這些兩個字串:

s = "Ac Kd Qh Js Tc 9d 8h"
t = "Kd Qh Js Tc 9d 8h 7c"

請注意兩個字串代表是在相同的六個的七個卡與非常相似的玩手。 不過,Hamming 距離 s 和 t 是 14,而且將出 Levenshtein 距離是 6。 在我的案例中,我實作名為 RotateDistance() 一個自訂的不同方法。 利用玩手字串的結構的方法,並比較 [RotateDistance() 根據卡值而定。 RotateDistance() 程式碼會列在 [圖 7。 我的自訂的不同方法開頭的計算方法的輸入引數 Hamming 距離:

s = "Ac Kd Qh Js Tc 9d 8h"
t = "Kd Qh Js Tc 9d 8h 7c"
distance = 14

下一步],RotateDistance(s,t) 旋轉字串 s 向左一個卡位置,並再次計算 Hamming 距離:

s = "Kd Qh Js Tc 9d 8h Ac"
t = "Kd Qh Js Tc 9d 8h 7c"
distance = 1

此方法會執行到所有的七個卡位置的此旋轉-和-比較處理程序,並傳回找到在此範例中是最小距離。 RotateLeft() Helper 方法的程式碼會使用 String.Substring() 分成兩個部分的輸入引數,然後字串串連到 recombine 兩個部分:

public static string RotateLeft(string s)
{
  string firstPart = s.Substring(0, 3);
  string remainder = s.Substring(3, s.Length - 3);
  string answer = remainder + " " + firstPart.Trim();
  return answer;
}

根據我的經驗中,測試輸入的字串有相當數量,旋轉-和-比較演算法我所描述的一些變化通常是結構的相當有效。 我要指出即使您測試的案例有高度結構化輸入的字串,您在寫入自訂差異的方法,跟我已經完成這裡沒有義務。 使用自訂的差異的方法可以協助產生更多不同的互相比所產生的使用 Hamming 距離或 Levenshtein 距離,衝鋒槍字串,但您必須評估對所需建立自訂的差異的方法,努力好處。

圖 7 的自訂 RotateDistance() 方法

public static int RotateDistance(string s, string t)
{
int d = HammingDistance(s, t);
for (int compare = 1; compare <= s.Length / 3; ++compare)
{
s = RotateLeft(s);
int temp = HammingDistance(s, t);
if (temp < d)
d = temp;
}
return d;
}

測試部分衝鋒槍字串

部分衝鋒槍字串測試其實是中繼-技術,表示方法多個一組一般的指導方針,而非一個特定的烹飪手冊樣式的方法可套用在所有測試的情況下。 其中一個許多可能的方式執行測試部分衝鋒槍字串所示的螢幕擷取畫面的圖 2] 所示。 的圖 8] 清單是索引鍵的程式碼產生的圖 2 中的螢幕擷取畫面。

第一次,我到命令殼層包括受測試系統的名稱顯示某些記錄的訊息,代理網域大小和 [衝鋒槍測試集大小。 使用我前一節所述,如果代理的網域擁有大小 m,且衝鋒槍測試大小大小 n,產生衝鋒槍測試集合方法需要 (n * (n-1) * m) / 2 反覆項目。 此外,字串比較會執行每個的反覆項目中,而且每一個比較需要至少 min(length(s),length(t)) 字元比較。 將點產生部分衝鋒槍測試集,您指定較大的代理的網域大小,以及大型的衝鋒槍測試集大小可能需要大量處理時間。 越大這些兩個的大小是、 愈好衝鋒槍測試設定方面測試字串輸入多樣性但是產生衝鋒槍測試集合所需時間減少輸入實際傳送到受測試系統的數目。

圖 8 的測試部分衝鋒槍與範例字串

int sdSize = 100;
int arSize = 10;
Console.WriteLine("\nBegin antirandom testing demo");
Console.WriteLine("System under test = PokerLib.dll module");
Console.WriteLine("Maximum number of cycles = 1,000,000");
Console.WriteLine("Surrogate domain size = " + sdSize);
Console.WriteLine("Antirandom test set size = " + arSize);
long maxNumberCycles = 100000;
int cycle = 0;
while (cycle < maxNumberCycles)
{
++cycle;
Console.WriteLine("=============================");
Console.WriteLine("Current antirandom cycle = " + cycle);
Console.WriteLine("Generating antirandom test set");
string[] arTestSet = MakeAntiRandomTestSet(sdSize, arSize);
Console.WriteLine("\nThe antirandom test set is: \n");
Console.WriteLine("[0] " + arTestSet[0]);
Console.WriteLine("[1] " + arTestSet[1]);
Console.WriteLine(" . . . . . . .");
Console.WriteLine("[9] " + arTestSet[9]);
Console.WriteLine(
"\nSending each antirandom input to system under test\n");
for (int i = 0; i < arTestSet.Length; ++i) {
PerformTest(arTestSet[i]);
}
Console.WriteLine("All antirandom input accepted by SUT\n");
}

接下來,我會指定循環來產生衝鋒槍測試集合的最大數目。 在許多測試情況下您想要執行測試持續 ; 衝鋒槍在這類的情況下您可以只取代迴圈使用 while(true) 時控制。 主要衝鋒槍控制迴圈中我會產生測試組的衝鋒槍,然後將每個字串傳送從測試設定為受測試系統的輸入。 我寫了兩個小型的 Helper 方法。 在第一個方法 MakeAntiRandomTestSet(),只需換行前一節所示的程式碼:

public static string[] MakeAntiRandomTestSet(int surrogateDomainSize,
  int antirandomTestSetSize)
{
  string[] result = new string[antirandomTestSetSize];

  string[] sd = new string[surrogateDomainSize];
  // generate surrogate domain, sd
  // fill antirandom test set, result
  return result;
}

第二個 Helper 方法 PerformTest(),接受一個字串,並模擬測試假設 PokerLib.dll 系統進行測試:

public static void PerformTest(string s)
{
  if (s[1] == 'c' && s[4] == 'c') {
    throw new Exception("Exception thrown in system
      under test\n" + "for input = " + s);
  }
}

此處我建立如果前兩個卡片的測試案例輸入的俱樂部,受測試系統,將會失敗的情況。 請注意,我還記得要顯示測試案例輸入,會產生系統失敗,這樣這個問題可以重現和最後修正的開發小組。 如果之後數日或甚至週或月執行中的延伸衝鋒槍測試,您受測試系統中產生嚴重的失敗,並找出您忘了記錄產生錯誤的輸入,它會不幸。

有許多您可以使用來部分衝鋒槍測試其他模式。 而非使用小型的 Surrogate 網域和小型的衝鋒槍測試加上大量的循環的設定,您可能要從大型代理網域產生一個大型的衝鋒槍測試集,並執行較少的測試週期。 請注意本節所述的方法會產生一衝鋒槍測試組和使用字串組,但不儲存任何 [衝鋒槍測試設定。 替代方法是測試設定例如文字檔案,這類的外部儲存為 Excel 試算表,或 SQL 資料表中,為字串會產生,在每個衝鋒槍中撰寫字串。 然後,如果想執行迴歸分析測試您將已輸入的測試準備好,且您執行的測試會更快,比如果您必須重新產生輸入]。

總結

我要合併彙算意見中這份文件] 所示。 部分衝鋒槍字串測試是一,是在其中一個受測試系統接受字串輸入,而輸入網域的大小是太大,無法徹底測試的情況下非常有用的技巧。 若要進行測試的部分衝鋒槍字串您第一次建立大型的代理的網域是隨機輸入網域的子集。 接下來,您產生的衝鋒槍測試集是彼此 maximally 不同測試集合中的字串的替代網域的子集。 接著,將衝鋒槍測試集合中的每個字串傳送到受測試系統。 在大多數的情況下您不會決定一個明確的預期值或狀態的每個衝鋒槍字串輸入。 而,您正嘗試會造成系統以某種方式失敗的測試。 Hamming 距離] 和 [Levenshtein 距離是兩個泛用的技術來計算兩個字串之間的差異值。 如果您的測試案例有字串具有較高程度的結構,您可以建立您自己的自訂字串差異的方法。 這種自訂的方法通常牽涉到字串旋轉。

學術研究欄位中的軟體測試一致地產生了建議的測試技術沒有單一最佳的結果。 當適當時,加入測試,以您的測試工作的部分衝鋒槍字串可以協助您產生有較少的錯誤,是更可靠及更安全軟體。

Dr。 James McCaffrey 適用於 Volt 資訊科學 Inc.他負責管理的軟體工程師在 Microsoft ’s 台北市,Wash.,校園基礎技術的訓練。 他已投入的幾個的 Microsoft 產品包括 Internet Explorer] 和 [MSN 搜尋,並的作者 「.NET 測試自動化:為問題方案 」 方法 (Apress 2006)。 Dr。 jmccaffrey@volt.comv-jammc@microsoft.com 連接 McCaffrey。