2017-07-17 21 views
1

說,我編寫單元測試用於如下聲明兩個功能:我們如何驗證所有可能的輸入參數組合?

void target_func_1(int param1, int param2); 
void target_func_2(int param1, int param2, int param3, int param4, int param5, int param6); 

對於上述兩個功能,所有輸入參數預計是-1或陽性。

所有可能的測試用例用於驗證的target_func_1輸入參數列在下面

  • 的param1 < -1 & & param2的> = -1 //未能
  • 參數1> = -1 & & param2的< - 1 //失敗
  • param1 < -1 & & param2 < -1 //失敗
  • 參數1> = -1 & & param2的> = -1 //成功

這看起來簡單。但是,target_func_2呢?可能有極端數量的六個輸入參數的可能組合。我是否必須爲target_func_2編寫所有這些測試用例?

+0

有相信其他人。但是,我最近給TDD上介紹,我意識到,我做**不**對這裏的TDD標籤的答案徽章。因此我將這個標籤添加到我的標籤列表中;是的,我經常基地;-) – GhostCat

回答

3

簡單的答案是:你不寫一個需要6個參數的方法。

換句話說:當你(通過與羅伯特·馬丁和其他人的名字學習優秀圖書爲例)瞭解乾淨的代碼你會發現,如此高的參數是絕對氣餒

並請明白:這不僅是因爲你有這麼多的排列到測試 - 但除此之外:這些參數可能都你的產品代碼中使用

從這個意義上說,真正的答案不是如何合理測試這種方法。它是:你不能以合理的方式測試這些方法;你不能以合理的方式實施它們,因此你不應該寫它們。

(請注意:這是關於必須做出基於參數決定的方法;如果你說,剛剛打印出來,例如這將是一個有點不同的故事)

多少,讓我們引用前面提到的書:

函數的理想參數個數爲零(niladic)。接下來是一個(monadic),接下來是兩個(二元)。應儘可能避免三個論點(三元)。超過三個(多邊形)需要非常特殊的理由 - 然後不應該被使用。

並請注意:這是底層編程語言的獨立

對於遺留代碼,我建議兩個摺疊方法。首先,你關注合同中方法的公共上。含義:你試圖理解「進入的內容」和「出去的內容」。然後,你可能會做一些覆蓋測量,也許添加更多的測試(針對採取的方法中的某些路徑)。但備案:你寫的測試,以使您能夠重構與此類遺留代碼。

除此之外:另一種方法可能是考慮基礎上,QuickCheck想法測試。含義:您指定性能的方法,然後框架爲您創建隨機參數,並試圖找出導致失敗的(關於這些屬性)的情況。

+0

然後可以請你告訴我,對於C++來用,有多少參數將是最大的功能?而且,遺產代碼呢? –

+0

我增加了一個段落。不知道如果快速檢查是否有合適的工具,但絕對tehre應該是一個C++實現了! – GhostCat