2013-10-12 192 views
3

我玩TDD和單元測試一般。我見過的所有例子都是返回值,這似乎是最簡單的情況。但是,如果我的函數沒有返回值呢?單元測試功能,不返回值

例如,假設我有一個Actor類,我需要一種方法來增加它的「健康」。我做了一個像下面這樣的單元測試,然後讓Actor類滿足它,但這是否正常並且很常見?我沒有看到很多使用單元測試中的屬性的例子。我應該用這種東西來思考嗎?

[TestMethod] 
    public void IncreaseHealth_PositiveValue_PositiveHealth() 
    { 
     Actor a = new Actor(); 

     int beforeHealth = a.Health; 

     a.IncreaseHealth(5); 

     int afterHealth = a.Health; 

     Assert.AreEqual(beforeHealth + 5, afterHealth); 
    } 
+3

是的,沒有錯或不常見的。你的測試沒問題。 –

+0

這很好,我會建議使用一些隨機數而不是一個常數,以增加覆蓋率。 – Ofiris

+1

我不會建議使用隨機數字,隨機數字可能會導致測試有時會通過,有時會失敗。如果有特殊情況需要調查(如int.MaxValue,int.MinValue,溢出等),請爲這些測試創建一個單獨的測試。在任何情況下,它們可能都需要特殊的處理,運行時的默認行爲很少是你想要的。 – jessehouwing

回答

4

這個測試是一個好的開始。但是,就像測試返回值的方法一樣,您應該對帶有副作用的方法測試邊界條件。在這種情況下,您也應該檢查

  • 你的方法不帶底片(或取底片,並且按預期工作)
  • 當由溢出整數一些較大的值遞增健康結果仍然可預測(例如,健康狀態的上限爲某個值)
  • 當以大於當前健康值的值減少健康值時,剩餘健康狀況不會變爲負值(除非允許)
  • 當健康狀況變爲零時,不管發生什麼其他事情,都應該觸發。

雖然您使用本地初始化對象沒有問題,但您也可以將其放在單元測試對象上,並在[Setup]方法中初始化它。

+0

我確實添加了負值測試,在這種情況下,因爲函數名稱是增加I didn'不想要發生任何事情。測試失敗,然後我回去,並添加一個if條件,它的工作。我在思考其他情況時遇到了問題,但是你所說的話是非常有意義的。我覺得有一個共同的東西來測試像溢出等主題。謝謝。 – user441521

+0

溢出一個很有趣,因爲VS甚至不會讓它編譯。所以看起來你甚至不能用.NET做這樣的測試呢?我知道C++可能會工作。我傳入Int32.MaxValue + 1但它不會編譯。 – user441521

+0

@ user441521要達到溢出,您需要調用'IncreaseHealth'兩次 - 一次使用'1'或其他正數,然後使用'Int32.MaxValue'。 – dasblinkenlight