使用組合改進軟體測試用例的生成3

2022-05-05 18:57:13 字數 1681 閱讀 5513

計算組合元素的個數

現在我已經確定了如何建立乙個組合物件,讓我們看看組合的三個基本操作的第二個——根據某個給定的條目總數 n 及子集大小 k 來計算組合元素的總數。舉個例子,如果你處理一次從 n=5 條目中取 k=3,這裡有10種可能的組合元素:

我想實現乙個 choose(n,k) 函式,它返回組合元素的個數;choose(5,3) 返回10。查詢現有的choose 實現,我驚訝地發現 internet 上的大多數演算法都很不耐用。在我向你展示我的 choose 實現之前,讓我們簡要地審視一下 choose 函式的標準實現。

編寫 choose(n,k) 函式的標準方法是直接使用其定義公式。這是乙個明顯的但是拙劣解決方案。這裡是乙個用 c# 編碼的典型 choose(n,k) 函式 :

以下是引用片段:

// poor implementation of choose(n,k)

static int choose(int n, int k)

輔助函式 factorial 的實現如下:

以下是引用片段:

static int factorial(int m)

return ans;

} 這裡的 choose(n,k) 實現有幾個問題:最嚴重的是它會因為當 n 和 k 的值十分小時而溢位。注意這個 choose(n,k) 首先計算 factorial(n), 即便 n 是乙個很小的值,它也會迅速增大到乙個非常大的數 ( 比如,21! 將溢位乙個無符號的 64 位數)。其次 choose(n,k) 的值由兩個階乘的乘積 來除,這也可能成為乙個非常大的數,得出的結果可能非常小。關鍵是即使 choose(n,k) 返回的結果很小,中間計算結果很容易溢位。

乙個更好的 choose(n,k) 實現使用乙個不同的方法計算其答案。改版的 choose(n,k) 使用以下不同的公式來計算:

choose(n,k) = (n * (n-1) * (n-2) * ... * (n-k+1)) / ( 1 * 2 * ... * k)

這個演算法看起來很醜,但用乙個例子來說明就知道,它更容易理解:

choose(7,3) = (7 * 6 * 5) / (1 * 2 * 3)

這個演算法取代了原來計算分子(乙個大數),然後計算分母(乙個大數),然後相除,你可以計算部分乘積法並隨意進行除法運算。對於 choose(7,3) 例子,你 先計算 7 * 6 並除以 2,得到 21(譯註:原文為「getting 24」顯然不對,7 * 6/2=21)(跳過此分數下面部分的第1項,因為被1除是沒有作用的)。這時用5乘以部分乘積並用3除,你可以得到答案35, 和前面的結果一樣。

這裡對 choose(n,k) 的第二次優化是由以下特性產生的:

choose(n,k) = choose(n, n-k).

舉個例子,choose(10,8) = choose(10,2)。這不是乙個明顯的關係,但是如果你用一些例子來試驗的話,你將看到為什麼這是對的。直接計算 choose(10,8) 之間涉及到計算七個部分乘積和七個除法,但是計算等價的 choose(10,2) 只要求乙個乘法和乙個除法操作。

綜上所述,我實現的 choose(n,k) 如 figure 5 所示。在 choose 函式中,我對 n 等於 k 的情況進行了快速檢查,如果為真,則返回 1。而 choose 演算法中沒有對之進行檢查,但它改進了生成特定 combination 物件元素的方法效能。choose 實現的剩餘部分用我剛剛解釋的演算法計算元素的總數。

使用PICT生成測試用例

介紹 pict 可以有效地按照兩兩測試的原理,進行測試用例設計 在使用pict時,需要輸入與測試用例相關的所有引數,以達到全面覆蓋的效果 安裝 工具會用就好,下面試試這個工具 在安裝目錄下新建乙個txt文件,填上引數,如下圖所示 需要注意的是,這裡使用的冒號和逗號都必須是英文格式下的符號,不然在使用...

使用PICT生成全面組合覆蓋的測試用例

pict the pairwise independent combinatorial testing tool 是 microsoft 內部使用一款測試用例設計工具。在實際使用過程中,需要輸入測試用例相關的引數,然後pict可以有效的按照兩兩測試的原理來建立和設計測試用例,以獲得引數的全面組合覆蓋...

測試用例組合 PICT

測試用例組合 一原理1.配對組合原理 兩兩組合原理 應用工具pict自動輸出組合 name a,b value 1,2 key m,n 如果自己組合那麼有2 2 2 8條用例 a1m a2m a1n a2n b1m b2m b1n b2n 使用配對組合原理結果是a2m a1n b2n b1m 2.基...