2010-03-01 224 views
8

我希望這不會成爲一個愚蠢的問題,但它是我一直想知道的。我希望編寫一個單元測試的方法,它包含一些邏輯來檢查某些值是否爲空。單元測試 - 我應該拆分測試還是進行單個測試?

public void MyMethod(string value1, string value2) 
{ 
    if(value1 != null) 
    { 
    //do something (throw exception) 
    } 

    if(value2 != null) 
    { 
    //do something (throw exception) 
    } 

    //rest of method 
} 

我想通過將空值傳遞給方法來測試它。我的問題是我應該爲每個參數創建一個單元測試,還是可以創建一個單元測試來檢查發生了什麼,如果我將value1設置爲null,然後檢查將value2設置爲null時會發生什麼。

[TestMethod] 
public void TestMyMethodShouldThrowExceptionIfValue1IsNull() 
{ 
    //test 
} 

[TestMethod] 
public void TestMyMethodShouldThrowExceptionIfValue2IsNull() 
{ 
    //test 
} 

[TestMethod] 
public void TestMyMethodWithNullValues() 
{ 
    //pass null for value1 
    //check 

    //pass null for value2 
    //check 
} 

或者它有什麼區別?我想我在某處讀到你應該限制自己每個單元測試的一個斷言。它是否正確?

在此先感謝 的ZAP

+0

這不是一個規則;這是一個判斷呼籲。如果測試是明顯且可讀的,那麼一個函數就可以。否則將它們拆分爲**可讀性**。 – Ray 2010-03-02 19:21:17

回答

9

你應該寫爲每個測試用例(斷言)一個單元測試,以避免Assertion Roulette

3

如果你正在做兩個測試在同樣的測試方法,你的測試都沒有做「單元測試」。

例如,如果第一個null值的測試失敗會怎麼樣?
如果兩個測試都採用相同的測試方法,則可能不會執行第二個測試;這意味着對第二個null值的測試取決於對第一個值的測試。

在另一方面,如果你有兩個單獨的測試方法,可以測試在完美的隔離每一種情況下。


從您的MyMethod方法的代碼判斷,這兩個條件之間沒有聯繫;這意味着在這兩個條件的測試之間不應該存在任何依賴關係。

所以:你應該使用兩個不同的測試。

+0

即使你將你的測試分組,你的測試代碼單元仍然是相同的 - 所以它仍然是單元測試:o)但是你逐漸失去的是查明失敗的能力。在實踐中,它是在很多測試(=很多語法)與查明能力之間進行權衡 - 請參閱邁克爾的答案。 – MaR 2010-03-01 12:58:40

6

「理想的」單元測試只是爲了準確地查明錯誤而測試一件事情。

實際上,這並不像大多數TDD支持者所說的那麼重要,因爲測試不會經常失敗,並且找出哪個失敗幾乎沒有時間,與其他調查和修復工作相比,問題。

編寫測試時保存失敗時自己的工作(這可能永遠不會發生)做額外的工作是YAGNI一種形式。

如果有多個方法沒有額外的工作之外更多的打字方法聲明,你應該這樣做,但如果它會導致重複設置的代碼,我看絕對沒有錯,在一個測試方法測試幾個條件。

0

推斷爲非技術性思想。

假設你有一輛車,並且你想測試顏色。

測試可能是:

車是紅色的。 汽車是藍色的。 汽車塗漆。

現在它可能是有意義的有「畫」和「藍」,但他們真的是不同的東西。如果你測試紅色和藍色,它總是會失敗 - 或者從隔離的角度來看失敗是沒有意義的。

總是按照您的建議測試一件東西,許多東西組成測試套件。