2011-01-05 43 views
14

我遇到以下問題:我知道NUnit中有Timeout屬性。我的問題是,單元測試實際上產生了一個新的過程,如果凍結從未被NUnit殺死。我怎樣才能實現一個實際上可以擺脫流氓流程的超時?NUnit中的單個測試超時

感謝, R.

回答

11

可以使用超時斷言,而不是超時整個測試方法:

Assert.That(actual, Is.EqualTo(expected).After(5000, 50)); 
+0

絕對的輝煌。之後你可以清理線程。 – ashes999 2011-01-05 15:46:19

+0

就像這樣,我無法使它適用於我的場景 - 產生另一個進程,彈出對話框,NUnit永遠不會殺死它,除非您單擊此按鈕。 – 2011-01-06 09:26:54

+1

那麼,因此你沒有進行驗收測試,我建議你使用類似 1)White http://white.codeplex.com/Thread/View.aspx?ThreadId=85842&ANCHOR 2)NUnit Forms http: //nunitforms.sourceforge.net/ 這兩個都適合創建窗口和按下按鈕。 – 2011-01-06 09:38:46

3

編輯:接受的答案是一個更好的。

如果你的測試最終超時(雖然晚於你希望),你可以隨時使用MaxTime屬性:http://www.nunit.org/index.php?p=maxtime&r=2.5.1和清理線程自己:

[Test, Maxtime(2000)] 
public void TimedTest() 
{ 
    ... 
} 

否則,你最好的選擇可能是實現你自己的計時機制。使用一個定時器(或一個繁忙的while循環),如果超時超時,則終止進程(可能在ShutDown方法中,如果它在測試中是通用的)和信號失敗。

NUnit超時沒有任何允許您在測試超時後運行代碼的事件。你必須自己推出,看起來像。

+0

很可能我必須走第二條路。就像一個例子 - 如果產生的進程在構建機器上彈出消息 - 沒有人點擊它 - NUnit超時將永遠不會啓動。所以它必須是我自己的一些時間機制。 – 2011-01-05 15:27:30

+0

fix build codesample:[Test,MaxTime(2000)] – razon 2015-02-25 10:03:35

0

確定。在我嘗試了NUnit中構建的所有功能並未能達到我需要的功能之後,我做了以下操作:我添加了一個定時器,該定時器在一個功能中設置爲歸因於設備級別上的[SetUp],因此之前被調用每個測試。如果計時器在測試完成之前打勾,我只需在計時器回調中進行清理。

0
[Test, Timeout(2000)] 
public void PotentiallyLongRunningTest() 
{ 
    ... 
} 

http://www.nunit.org/index.php?p=timeout&r=2.5.1

的TimeoutAttribute用於指定以毫秒爲單位的測試情況下的超時值。如果測試用例的運行時間超過指定的時間,則立即取消並報告爲失敗,並顯示超時超時的消息。

該屬性也可以在燈具或裝配體上指定,在這種情況下,它表示任何下級測試用例的默認超時值。