2012-03-12 19 views
4

全部是在標題,我不知道它是否是一個好的做法或不:在單元測試中,如果運行速度太慢時拋出異常,那麼衡量方法的執行時間是否是一種很好的做法?

[TestMethod] 
public void Compute_Array_In_Less_1_Second() 
{ 
    Stopwatch watcher = new Stopwatch(); 

    int[] A = Enumerable.Range(0, 50000).Select(i => GetRandomNumber(MIN_INT, MAX_INT)).ToArray(); 

    watcher.Start(); 
    int[] R = Program.MethodThatReturnsAnArray(A); 
    watcher.Stop(); 

    if (watcher.ElapsedMilliseconds > 1000) 
     Assert.Fail("The method runs in more 1 second"); 
} 

謝謝

+2

單元測試應測試代碼的功能是否正常工作。您通常不會使用它們來測試性能測試下的性能:-) – Magrangs 2012-03-12 16:22:32

回答

3

你應該用你的測試框架提供適當的機制,如:http://nunit.org/index.php?p=timeout&r=2.5

但請注意,你不想到處做這個(測量的性能),但要測試該單元實際上是如果需要這樣做,可以及時或完成。

+0

我認爲它主要用於測試超時參數的方法。 – 2012-03-12 17:57:47

+0

@HenkHolterman - 這就是最後一句話所說的 – manojlds 2012-03-12 18:55:24

7

不,這不是。

單元測試不在'正常'條件下執行,所以結果將毫無用處。

使用單元測試來驗證代碼的正確語義。

在接近生產環境的條件下設置性能測試(通常是端對端)。

+1

我同意這一點,因爲您通常會在單元測試中使用mock。 – Magrangs 2012-03-12 16:25:31

0

我認爲這部分取決於測試的內容。如果它可能會超時(比如說,獲得網絡連接,這應該在特定時間內發生),這可能是合適的。正如Magrang所提到的,計時事情實際上是比單元測試更多的性能測試。單元測試只是檢查是否運行的東西實際上正在做它應該做的事 - 不檢查它是否運行得像它應該的那樣快。

0

這取決於應用程序。

如果由於外部進程運行速度太慢而導致數據丟失,您可能需要引發異常。

但你仍然必須處理它。爲什麼不把它發生在哪裏呢?

2

不會。它將您的單元測試失敗/成功耦合到機器/環境。你不希望有人使用較慢的機器來進行單元測試,因爲......機器較慢?

這些測試可能仍然有它們的位置,但不是作爲一個單元測試 - 可能更多的是功能測試或集成測試,這些測試並非由團隊中的每個開發人員運行。

相關問題