本文章是由機器翻譯。

測試回合

透過 QICT 進行成對測試

James McCaffrey

下載程式碼範例

實心知識的 pairwise 測試原則是不可或缺的所有軟體測試人員、 開發人員和管理員。這個月 ’s 欄中我解釋到底什麼 pairwise 測試是,並提供您針對生產-品質 pairwise 測試工具名為 QICT 完成 C# 原始程式碼。簡而言之,pairwise 測試是一項技術,可讓您減少可能顯示 Bug 受測試系統中一小很多組的測試案例輸入一大,無法管理組。解釋 pairwise 測試,並顯示我字形本文章中,最好是由兩個螢幕擷取畫面的方式。請考慮在虛設的 Windows Form 為基礎的應用程式 的 圖 1 所示。應用程式有四個輸入的參數。第一個參數是可以接受 「 a 」 或 「 b 」 的 TextBox 控制項。第二個參數則是一群選項按鈕控制項可以採用 「 c 」、 「 d 」、 「 e 」 或 「 f 」 的值。第三個參數是一種組合方塊控制項,可以採取值為 「 g 」 「 h 」 或 「 i 」。第四個參數是採用 「 j 」 或 「 k 」 的值的核取方塊控制項。因此,會是一個測試案例輸入的組 {「 一 」、 「 c 」、 「 g 」、 「 j 」}。虛設的應用程式有個 2 * 4 * 3 * 2 = 48 可能輸入設定,何者是肯定容易管理。但假設卡播放應用程式的一些排序以其中每個參數可在 52 值之一 (若要從一般的紙牌花色與取代的遊戲卡片表示一張卡) 的五個參數。在這種情況下有就可能 52 * 52 * 52 * 52 * 52 = 380,204,032 輸入設定,這很可能是無法管理,除非您以程式設計方式產生無法預期的值每項測試集輸入。

圖 1 A 虛擬應用程式具有四種的輸入參數

pairwise 測試的概念是產生擷取所有可能從每個參數的參數數值組的測試集合的清單。的 圖 1 所示的範例中,,共有的 44 這類輸入組:

(a,c), (a,d), (a,e), (a,f), (a,g), (a,h), (a,i), (a,j), (a,k), (b,c), (b,d), (b,e), (b,f), (b,g), (b,h), (b,i), (b,j), (b,k), (c,g), (c,h), (c,i), (c,j), (c,k), (d,g), (d,h), (d,i), (d,j), (d,k), (e,g), (e,h), (e,i), (e,j), (e,k), (f,g), (f,h), (f,i), (f,j), (f,k), (g,j), (g,k), (h,j), (h,k), (i,j), (i,k)

現在測試組 {「 一 」、 「 c 」、 「 g 」、 「 j 」} 擷取六 44 配對:(一個,c),(a,g),(一個,j),(c,克) (c,j) 和 (g,j)。因此成對測試設定產生的目標是要產生擷取所有 44 配對的測試集合的集合。的 圖 2 中看螢幕擷取畫面看。

圖 2 成對測試設定與 QICT 工具產生

螢幕擷取畫面顯示名為 qict.exe 產生 12 擷取所有 44 輸入的組 的 圖 1 所示案例的測試集合的集合。如果您追蹤透過 12 的 圖 2 所產生的測試集中值的每一對,看到他們做事實上擷取上面所列的所有 44 配對。因此在這種情況下我們降低了我們可能的測試案例輸入從 48 測試實例到 12 的測試案例。省下 aren’t 這個小型範例非常重要,但我說明待會兒,使用 pairwise 測試可以大幅減少在許多情況下的測試案例輸入的數目。pairwise 測試的基礎假設前題是在非程式碼中所牽涉到從內某特定參數的值,牽涉到從不同的參數值的互動的程式碼中更頻繁地找到了軟體錯誤。亦即為 的 圖 1 虛設的應用程式,處理輸入 「 a 」 及 「 g 」 的應用程式的程式碼更可能會引入比處理輸入 「 a 」 及 「 b 」 的程式碼的邏輯錯誤。這是在實際上,支援的一些研究的概念。

使用 PICT 工具

有許多成對測試集產生工具可供您使用。在大部分情況中我最愛工具是 PICT (配對獨立組合測試) 工具。由我同事適應來自現有內部 Microsoft 成對工具的程式碼的 Jacek Czerwonka 寫入 PICT。使用作為從包括在 msdn.microsoft.com/testing/bb980925.aspx Microsoft 軟體測試人員 」 頁面的數個位置的免費下載 PICT。如果您搜尋網際網路時,您也會發現幾個其他成對測試設定產生工具。不過,PICT 是單一的可執行檔,是從 shell 命令列執行。PICT 是非常快速、 強大,而且應該符合您的 pairwise 測試需要在大部份的情況。我命名工具本文 QICT (其 doesn’t 突顯的任何項目特別) 中呈現給認可 PICT 工具的重要性。

如此,為什麼但另一個成對測試設定產生器?有幾個原因。  先,雖然 PICT 太工具撰寫在原生 C + + 程式碼時,原始碼則無法使用。此處介紹的 QICT 工具是,就我可以告訴第一個生產品質成對工具撰寫 Managed C# 程式碼。可用性的程式碼可讓您自由地修改以符合自己需求的 QICT。比方說您可以修改 QICT 直接從 XML 檔案或 SQL 資料庫中讀取其輸入,或者您可以修改 QICT 直接發出自訂的輸出格式中的結果。和可能想要實驗工具 ’s 邏輯說,例如藉由引入條件約束 (測試輸入集不允許),藉由引入必要的測試集,或是變更工具如何產生其測試設定集合。此外,QICT 原始程式碼的可用性可以讓您複製和成對的地方直接將.NET 應用程式] 或 [測試工具測試設定的產生程式碼。最後,雖然原始碼的一些成對測試集產生工具在網際網路上使用但是某些這些工具是相當沒有效率。例如,考慮每一個都有 10 個值以 20 參數的情況。此案例中,有 10 * 10 * 10 *。..* 10 (20 倍) = 1020 = 100,000,000,000,000,000,000 可能的測試案例輸入。這是很多的測試案例。PICT 工具可以降低這對只 217 的成對測試組,並 QICT 工具會產生 219 或 216 測試組 (相依於隨機亂數產生器的種子值我稍後說明)。不過,一個廣泛參考成對測試設定的產生工具所撰寫的 Perl 產生 664 集。最後,QICT 來源程式碼可用和的演算法使用本文 ’s 解釋,您可以 recast QICT 等 Perl、 Python、 Java 或 JavaScript 其他語言來如果您希望。

QICT 工具

QICT 工具的程式碼是稍微太長以呈現在本專欄中完整,但從 MSDN 程式碼庫 code.msdn.microsoft.com 在整個原始程式碼是可用。我將說明演算法和資料結構,我使用,連同關鍵程式碼片段所以有足夠的資訊來使用,並視需要修改 QICT。QICT 如何運作的要素是一次產生一個測試組使用窮盡演算法來放置每個參數的值,直到擷取所有的可能配對。高階演算法對於 QICT 的 圖 3 所示。

圖 3 的 QICT 演算法

read input file
create internal data structures

create an empty testset collection
while (number of unused pairs > 0)
  for i := 1 to candidate poolSize
    create an empty candidate testset
    pick the "best" unused pair
    place best pair values into testset
    foreach remaining parameter position
      pick a "best" parameter value
      place the best value into testset
    end foreach
  end for
  determine "best" candidate testset
  add best testset to testset collection
  update unused pairs list
end while

display testset collection

實作這個高階的演算法的關鍵決定要使用的資料結構和各種不同的 「 最佳 」 選項的是何種。 QICT 來源程式碼一開始就像這樣:

static void Main(string[] args)
{
  string file = args[0];
  Random r = new Random(2);
  int numberParameters = 0;
  int numberParameterValues = 0;
  int numberPairs = 0;
  int poolSize = 20;

我撰寫的程式碼 QICT 使用傳統的程序樣式,而不是採取物件導向的手法,因此您可以更輕鬆地重整 QICT 例如 Perl 和 JavaScript 的部分 OOP 支援的語言。 我先從命令列讀取輸入的檔。 您可以看到以保持我的程式碼清楚又簡單,我留下出一般錯誤-檢查您要包含。 輸入的檔的 QICT 會使用 PICT 如下所示的簡單文字檔案的相同:

Param0:a,b
Param1:c、 d、 e、 f
等等

參數名稱後接冒號字元以及該參數的合法值的逗號分隔清單。 參數值必須明確。 接下來,我具現化 Random 物件。 選擇的種子值 2 是任意,但任何值會讓 QICT 產生相同的結果為輸入組,每次執行時。 我很快就解釋虛擬隨機數字的物件的目的。 我宣告將會指派值當讀取輸入的檔的三個 int 變數。 的 圖 2 所示的範例,numberParameters 是 4,numberParameterValues 為 11 及 numberPairs 為 44。 poolSize 變數會儲存候選測試集,來產生每個測試組數目。 如果您實驗 QICT 有點,您查看工具影響而是令人意外次要的方式,藉由調整 poolSize 的值。 QICT 的核心是主要資料結構的宣告。 前四個物件如下:

 

int[][] legalValues = null;
string[] parameterValues = null;
int[,] allPairsDisplay = null;
List<int[]> unusedPairs = null;

該 legalValues 物件可說是不規則的陣列的每個儲存格依序持有 int 值的陣列。 legalValues 陣列保留輸入檔的記憶體中表示,因此的合法值的儲存格 0 保存輪流保留值為 0 的陣列 (來代表參數值 「 是 」) 和 1 (用來代表 「 b 」)。 其實直接使用字串值是相當沒有效率,表示參數值為整數,可產生更快的效能。 parameterValues 字串陣列存放的實質參數值,並且 QICT 結尾處用來為字串,而非 ints 顯示結果。 所以,前述例如 0 的儲存格會保留 「 」、 儲存格 1 保留 「 b 」 依此類推直到儲存格 10,它會保留 「 k 」。 allPairsDisplay 物件是個 ints 的二維陣列。 它會填入所有的可能配對。 我們例如 [0,0] 的儲存格保留在 0 (「 a 」) 和儲存格 (如 「 c 」) 的 [0,1] 保留 2 — 第一可能對。 儲存格 [1,0] 保留 0 與儲存格 [1,1] 保留 3 代表第二個配對 (a,d)。 unusedPairs 物件是泛型清單的 int 的陣列。 第一個項目中 unusedPairs 是最初 {0,2}。 我使用清單集合 unusedPairs,而不是陣列,因為每次一組新的測試加入至測試設定集合,我移除從 unusedPairs 設定新的測試所產生的配對。 此外,這表示我有 unusedPairs.Count 到達 0 時會發生的便利的停止條件。

接下來四個主要程式資料結構是:

int[,] unusedPairsSearch = null;
int[] parameterPositions = null;
int[] unusedCounts = null;
List<int[]> testSets = null;

最 pairwise 測試集產生工具包括 QICT,執行大量的搜尋。 一個有效率的查閱的方法是以合理的效能很重要。 此處我宣告名為 unusedPairsSearch 一個二維陣列。 它是方形的陣列與 numberParameterValues,依大小 numberParameterValues 其中每個儲存格 1,如果未使用相對應的配對和一個 0 如果保留相對應的配對已使用或不是有效的組。 一開始,unusedPairsSearch 例如 [圖 2] 中的前三個資料列是:

0 0 1 1 1 1 1 1 1 1 1
0 0 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 1 1 1 1 1

等等。

所以第一列表示配對 (0,0) 和 (0,1) — 也就是一個 (一) 和 (a,b) — 不是有效組 (0,2) (0,3) 時。 . . (0,10) — 也就是 (一個,c),(a,d) 透過 (一個,k) — 不尚未被佔領了由測試組。 parameterPositions 陣列會保留指定的參數值的測試集中位置。 在初始化後此陣列存放的值:

0 0 1 1 1 1 2 2 2 3 3

parameterPositions 索引代表參數值,對應儲存格的值代表其在測試組中的位置。 以便從左邊第四個儲存格有索引 = 3 與值 = 1,表示參數值 3 (「 d 」) 屬於在位置 1 (第二個插槽) 測試集合中。 unusedCounts 物件是一維的陣列,存放在 unusedPairs 陣列中出現特定的參數值的次數。 一開始會保留 unusedCounts:

9 9 7 7 7 7 8 8 8 9 9

索引代表參數值,對應儲存格的值是未使用的計數。 因此,從左邊第四個儲存格有索引 = 3 和值 = 7,最初表示參數值 3 (「 d 」) 會出現在 7 未使用的配對 — (a,d),(b,d) (d,克) (d,h) (d,i),(d,j) 以及 (d,k)。 testSets 物件擁有成對測試組結果。 它是一開始是空的但成長每次產生一組新的測試。 每個測試組會以 int 的陣列。 所以,[圖 2] 設定在結果的第一個測試是 {「 一 」、 「 c 」、 「 g 」、 「 j 」},其儲存為 testSets 清單中的值 {0,2,6,9} 陣列。

與位置中的 [索引鍵資料] 結構 QICT 會讀取輸入的檔判斷 numberParameters 和 numberParameterValues 的值,並填入 legalValues 和 parameterValues 陣列。 我使用執行之檔案的初始讀取並再重設檔案指標,然後透過檔案執行第二次傳遞較為粗糙的方法。 一旦填入 legalValues 我可以掃描透過它來決定輸入的配對數目:

for (int i = 0; i <= legalValues.Length - 2; ++i) {
  for (int j = i + 1; j <= legalValues.Length - 1; ++j) {
    numberPairs += (legalValues[i].Length * legalValues[j].Length);
  }
}
Console.WriteLine("\nThere are " + numberPairs + " pairs ");

在初始化後, 第一列的 legalValues 持有 {0,1},而且第二個資料列保存 {2,3,4,5}。 請注意配對由這些兩個資料列是 (0,2) (0,3) (0,4) (0,5) (1,2) (1,3) (1,4) 和 (1,5),而且在一般配對由 legalValues 中的任何兩個資料列數目等於資料列的資料列的 Length 屬性的兩個資料列中值的個數的乘積。 下一個部分 QICT 碼填入 unusedPairs 清單:

unusedPairs = new List<int[]>();
for (int i = 0; i <= legalValues.Length - 2; ++i) {
  for (int j = i + 1; j <= legalValues.Length - 1; ++j) {
    int[] firstRow = legalValues[i];
    int[] secondRow = legalValues[j];
    for (int x = 0; x < firstRow.Length; ++x) {
      for (int y = 0; y < secondRow.Length; ++y) {
        int[] aPair = new int[2];
        aPair[0] = firstRow[x];
        aPair[1] = secondRow[y];
        unusedPairs.Add(aPair);
      }
    }
  }
}

此處我抓取 legalValues 的資料列的每一對 i 和 j,使用索引。 我接下來,逐步中使用索引每個資料列配對值 x 和 y。 多重巢狀 For 迴圈就像這樣的廣泛使用方式是組合的程式碼的證明。 當我在撰寫這類程式碼時我永遠繪製手因為 ’s 很容易犯錯而圖表不牽涉到陣列的紙張上。 之後填入 unusedPairs 清單,我可以使用相同的巢狀的迴圈結構來填入 allPairsDisplay 和 unusedPairsSearch 陣列。 初始化程式碼接下來會藉由逐一查看 legalValues 填入 parameterPositions 陣列:

parameterPositions = new int[numberParameterValues];
int k = 0;
for (int i = 0; i < legalValues.Length; ++i) {
  int[] curr = legalValues[i];
  for (int j = 0; j < curr.Length; ++j) {
    parameterPositions[k++] = i;
  }
}

初始化程式碼結束由填入 unusedCounts 陣列:

unusedCounts = new int[numberParameterValues];
for (int i = 0; i < allPairsDisplay.GetLength(0); ++i) {
  ++unusedCounts[allPairsDisplay[i, 0]];
  ++unusedCounts[allPairsDisplay[i, 1]];
}

這裡,在很多 QICT 常式我利用事實 C# 會自動初始化為 0 的 int 陣列中的所有儲存格。 如果想 recast QICT 為物件導向的樣式所有這些初始化常式會很可能最適合放置在了物件建構函式或可能是明確的 Initialize() 方法中。 主要處理迴圈一開始:

testSets = new List<int[]>();
while (unusedPairs.Count > 0) {
  int[][] candidateSets = new int[poolSize][];
  for (int candidate = 0; candidate < poolSize; ++candidate) {
    int[] testSet = new int[numberParameters];
  // fill candidate testSets
  }
  // copy best testSet into testSets collection; upate data structues
}

因為候選測試集數目已知為 poolSize,
I 可以具現化陣列而非使用 List 物件,動態調整大小。 請注意 unusedPairs 集合的大小控制主要處理迴圈結束。 現在 ’s 挑選 「 最佳 」 的未使用的配對的時間 — 並事情現在開始變得非常有趣:

int bestWeight = 0;
int indexOfBestPair = 0;
for (int i = 0; i < unusedPairs.Count; ++i) {
  int[] curr = unusedPairs[i];
  int weight = unusedCounts[curr[0]] + unusedCounts[curr[1]];
  if (weight > bestWeight) {
    bestWeight = weight;
    indexOfBestPair = i;
  }
}

此處我定義最佳表示未使用一對具有最高未使用的個別參數值的總和。 比方說如果 「 一 」 會顯示目前未使用的配對的清單中的一次,會 「 b 」 出現兩次,以及 「 c 」 三次與 「 d 」 四次然後配對 (一個,c) 有重量 1 + 3 = 4 而且配對 b (d) 重量 b (d) 2 + 4 = 6,因此配對 b (d) 就會選取透過 (一個,c)。

有許多您可能想要瀏覽其他加權配置。 例如使用某種乘法會讓較高的加權平均來組極端值相比較成對的未使用計數的未使用的有計算一起更接近。 另一個可能性是追蹤使用的計數 — 參數值出現在測試集合已經加入至結果 testSets 集合中的次數 — 並挑選如最佳配對一個具有至少使用的計數。 一旦決定最佳的未使用的配對我會建立兩個儲存格陣列保存組值,並決定每個值屬於測試集內位置:

int[] best = new int[2];
unusedPairs[indexOfBestPair].CopyTo(best, 0);
int firstPos = parameterPositions[best[0]];
int secondPos = parameterPositions[best[1]];

此時我有空測試組和一組數值將放在 [測試] 集合中,我知道值屬於測試集中位置。 下一步是產生測試組中剩餘的位置的參數值。 現在,而不是填滿一些固定順序 (從低到高索引) 中的測試組位置,其實填滿隨機順序中設定的測試會比較好。 第一次,我會產生保留參數位置循序的陣列:

int[] ordering = new int[numberParameters];
for (int i = 0; i < numberParameters; ++i) 
  ordering[i] = i;

接下來,我重新藉由將前兩個值的最佳配對的已知的位置放入前兩個儲存格排序陣列的排列順序:

ordering[0] = firstPos;
ordering[firstPos] = 0;
int t = ordering[1];
ordering[1] = secondPos;
ordering[secondPos] = t;

現在我隨機剩餘的位置 (從 2 的儲存格及往上),並使用 Knuth 隨機演算法。 這就是為什麼我 QICT 程式碼的開頭建立一個隨機的物件。 測試集合所產生的 QICT 數目是令人意外機密的虛擬隨機數目產生器種子值,值,因此您可能要試驗幾個識別值種子值。 以我先前所述,使用一個識別值種子 20,10 值參數的情況 2 的值會產生 219 的測試集和種子值為 6 會產生 216 的測試集但種子值為 0 會產生 221 測試集。

for (int i = 2; i < ordering.Length; i++) {
  int j = r.Next(i, ordering.Length);
  int temp = ordering[j];
  ordering[j] = ordering[i];
  ordering[i] = temp;
}

之後 shuffling,我需要將這兩個值的最佳配對放候選測試組:

testSet[firstPos] = best[0];
testSet[secondPos] = best[1];

現在進入 QICT 演算法的最重要的部分。 我必須決定最佳的參數值,將放置在每個空測試組位置。 我使用的技術是窮盡的另一種方法。 針對每個參數] 位置我藉由計算多少未使用的配對,測試值時加上其他的值已經在測試中設定擷取測試每個可能的法律值,該位置。 然後我選取擷取最未使用的配對的參數值。 這項作業的程式碼屬於最棘手的 QICT,且會列在 的 圖 4

圖 4 填入測試設定與最佳的參數值

for (int i = 2; i < numberParameters; ++i) {
  int currPos = ordering[i];
  int[] possibleValues = legalValues[currPos];
  int currentCount = 0;
  int highestCount = 0;
  int bestJ = 0; 
  for (int j = 0; j < possibleValues.Length; ++j) {
    currentCount = 0;
    for (int p = 0; p < i; ++p) {
      int[] candidatePair = new int[] { possibleValues[j],
        testSet[ordering[p]] };
      if (unusedPairsSearch[candidatePair[0], candidatePair[1]] == 1 ||
        unusedPairsSearch[candidatePair[1], candidatePair[0]] == 1)
        ++currentCount;
    }
    if (currentCount > highestCount) {
      highestCount = currentCount;
      bestJ = j;
    }
  }
  testSet[currPos] = possibleValues[bestJ];
}

圖 4 在最外層的迴圈是測試集位置 (由 numberParameters 給定),以下兩個總數的計數 (因為兩個點會使用最佳的配對)。 在該迴圈我擷取目前點來填滿透過查看我稍早建立的排序陣列中的位置。 currentCount 變數會保留未使用俘虜測試參數值的配對數目。 請注意因為我正在填入測試組位置以隨機順序,候選組數值可以順序,所以我需要我成 unusedPairsSearch 陣列做為查閱時檢查兩個可能性。 的 圖 4 中的程式碼結尾我將會有候選,測試都有使用窮盡演算法選取的值在每個位置的設定。 現在只需要加入求職者的集合中設定此候選測試:

candidateSets[candidate] = testSet;

此時我有 n = poolSize 候選測試集和我需要選取這些主要 testSet 結果集合中加入的最佳。 我可以假設第一的候選測試組擷取最未使用的配對,並只需逐一查看每個候選位置 0,開始但再次,介紹一些隨機性會產生較佳結果。 我挑選隨機特別內候選字,並假設它是最佳的候選:

int indexOfBestCandidate = r.Next(candidateSets.Length);
int mostPairsCaptured =
  NumberPairsCaptured(candidateSets[indexOfBestCandidate],
    unusedPairsSearch);

此處我使用名為 NumberPairsCaptured() 有點 Helper 函式來決定多少未使用的配對俘虜指定的測試組。 Helper 函式是:

static int NumberPairsCaptured(int[] ts, int[,] unusedPairsSearch) 
{
  int ans = 0;
  for (int i = 0; i <= ts.Length - 2; ++i) {
    for (int j = i + 1; j <= ts.Length - 1; ++j) {
      if (unusedPairsSearch[ts[i], ts[j]] == 1)
        ++ans;
    }
  }
  return ans;
}

現在我逐一執行每個候選測試組,追蹤的擷取最未使用的配對的一個位置:

for (int i = 0; i < candidateSets.Length; ++i) {
  int pairsCaptured = NumberPairsCaptured(candidateSets[i],
    unusedPairsSearch);
  if (pairsCaptured > mostPairsCaptured) {
    mostPairsCaptured = pairsCaptured;
    indexOfBestCandidate = i;
  }
}

並現在我將複製設定成主要結果 testSets 清單物件的最佳候選測試:

int[] bestTestSet = new int[numberParameters];
candidateSets[indexOfBestCandidate].CopyTo(bestTestSet, 0);
testSets.Add(bestTestSet);

這個時候我已經產生,並加入新測試集,因此我必須更新所有資料結構受到影響,也就是,unusedPairs 清單 (藉由移除新的測試集所產生的所有組),unusedCounts 陣列 (依遞減為新的測試集合中每個參數值計數) 和 unusedPairsSearch 矩陣 (藉由翻轉與產生新的測試,從 1 設定為 0 的每一對相關聯的值)。

現在我 ’m 我主要處理迴圈的結尾。 我繼續產生求職者、 選取最佳的候選、 加入 testSets 的最佳候選和更新資料結構的作業。 當未使用的配對的數目達到 0,將會結束處理。

然後我會顯示最後的結果:

Console.WriteLine("\nResult testsets: \n");
for (int i = 0; i < testSets.Count; ++i) {
  Console.Write(i.ToString().PadLeft(3) + ": ");
  int[] curr = testSets[i];
  for (int j = 0; j < numberParameters; ++j) {
    Console.Write(parameterValues[curr[j]] + " ");
  }
  Console.WriteLine("");
}
  Console.WriteLine("");
}

如我先前所述,如果您正在修改以符合您自己特定的測試案例 QICT,您可以發出結果直接為 SQL 資料庫或其他形式的儲存空間的 XML 檔案。

產生較佳的系統

pairwise 測試是一項組合的技巧與 probabilistic 因素。成對測試設定的產生是重要的技術,但 isn’t 魔法。請記住成對的技巧只減少測試案例輸入的情況下,您只需要太多的測試案例來應付的位置數目。成對測試設定的產生並不會建立測試案例預期的結果。您應該永遠開始使用一般測試原則,例如查看界限條件來使用純粹隨機輸入和等等,然後使用 pairwise 測試補充測試案例層代。此外一般法則,多個測試是較佳,所以有 ’s 為什麼您 can’t 新增額外的測試案例輸入給那些由成對產生工具所產生的原因。雖然 pairwise 測試是在許多情況下有用,請務必使用它只在適當時機。

我已經發現成對測試設定的產生是非常有用,對於組態測試的單元測試方法接受列舉值和測試 SQL 資料庫的其中一個資料表中的每一欄都有相對少數的不同值。pairwise 測試不一定是好的方法,您有相對少數的測試案例輸入,或當您可以程式設計方式產生測試案例預期的結果 (並因此處理大型的測試案例輸入集合) 的案例。pairwise 測試時,則無法通常可使用受測試系統輸入的值不是不連續。不過,即使在可能的參數數值個數會非常大的情況中您或許能夠有效地使用成對的測試案例輸入至等價類別分隔參數值所產生。當使用正確、 pairwise 測試設定的產生是一種重要的技巧,可以幫助您產生更好的軟體系統。

Dr。James McCaffrey* Volt 資訊科學 Inc.他負責管理軟體工程師的技術訓練的運作方式根據在 Microsoft ’s 台北市,Wash., 校園。他已投入的幾個的 Microsoft 產品包括 Internet Explorer] 和 [MSN 搜尋並* 作者  .NET 測試自動化食譜:問題解決方案接近(Apress, 2006)。 解決詹姆斯可以達到 jmccaffrey@volt.comv-jammc@microsoft.com

多虧給來檢閱這份文件的技術專家下列:Jacek Czerwonka

將針對解決 James 提出問題或意見傳送給 testrun@microsoft.com