2011-02-07 96 views
2

假設我有下面的函數(僞):請提出一個單元測試方法的簡單功能

bool checkObjects(a, b) 
{ 
    if ((a.isValid() && (a.hasValue()) || 
     (b.isValid() && (b.hasValue())) 
    { 
     return true; 
    } 

    return false; 
} 

我應該寫哪些測試能夠聲稱它是100%覆蓋?

總共有16種可能的輸入組合。我應該編寫16個測試用例,還是應該儘量採取行動並省略一些測試用例?

舉例來說,我應該寫

[a valid and has value, b valid and has value] 

測試,如果我測試了一下它返回什麼預期

[a valid and has value, b invalid and has value] 

[a invalid and has value, b valid and has value] 

謝謝!

P.S .:也許有人可以建議閱讀單元測試方法嗎?

回答

1
由Kent Beck

測試驅動開發是做得好的,並正在成爲一個經典(http://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530)

如果您想要徹底的最大,然後是16個檢查將是值得的。

1

這取決於。親自說一句,我會滿意地測試所有的邊界條件。因此,兩種情況都是如此,但是使一個項目爲假將會使整體結果爲假,並且所有4個假使一個項目爲真的假情況會使總體結果爲真。但這是一個判斷性的呼籲,我不會讓任何一個做過所有16個案件的人都犯錯。

順便說一句,如果您的單元測試了一個真實案例和一個錯誤案例,代碼覆蓋率工具會說您有100%的覆蓋率。

1

如果您擔心編寫16個測試用例,您可以嘗試一些功能,如NUnit TestCaseMbUnit RowTest。其他語言/框架應該具有相似的功能。

這將允許您使用單個(和小型)測試用例測試所有16個條件)。

1

如果測試看起來很難,請考慮重構。我可以在這裏看到幾種方法。首先將isValid()hasValue()合併成一種方法並單獨測試。爲什麼有checkObjects(a, b)測試兩個不相關的對象?爲什麼你不能有checkObject(a)checkObject(b),進一步降低可能性的指數增長?只是一個提示。

如果您真的想測試所有16種可能性,請考慮一些更多的表格工具,如Fitnesse(請參閱http://fitnesse.org/FitNesse.UserGuide.FitTableStyles)。還請檢查Parameterized JUnit runner和TestNG。