2015-12-15 63 views
2

我想在Visual Studio中的測試中使用NUnit超時屬性,但它似乎並沒有工作。我期望這個測試失敗,但它會運行20秒,然後通過。爲什麼NUnit超時屬性不起作用?

它爲什麼不失敗?

namespace Tests 
{ 
    using System.Threading; 
    using NUnit.Framework; 

    [TestFixture] 
    public class timeout_tests 
    { 
     [Test, Timeout(1)] 
     public void timeout_test() 
     { 
      Thread.Sleep(20000); 
     } 
    } 
} 

我試着用NUnit.framework.dll 3.0.0版和最新版本3.0.1。這兩個版本在20秒後通過測試。

+0

我無法準確使用VS測試適配器或控制檯運行器使用您的測試和最新的NUnit v3。你能用'--trace = Verbose'運行控制檯併發布生成的跟蹤文件的內容嗎? –

+0

日誌文件:https://github.com/LVBen/Documents/blob/master/nunit-console_10936.log – LVBen

+0

應該有另一個日誌文件,可能與您的程序集的名稱在文件名中。你可以發表那一個(把它放在你的問題中)?它看起來像你使用的是NUnit控制檯的v2.6.2版本,而不是v3.0。 –

回答

1

事實證明,使用較舊的NUnit測試適配器(例如版本2.0.0.0),測試在20秒後過去,這不是預期的結果。

刪除舊適配器並安裝NUnit3測試適配器後,現在測試立即失敗,這是預期結果。

-1

這似乎是固定在latest version of the NUnit adapter,2.1.1。

雖然我個人被愚弄了,但事實上我很快就發送了大量的輸出到Console(它在輸出窗口捕獲,我相信通過適配器)。這在輸出中創建了一種「後退日誌」,.NET想要在測試退出之前完成發送它收到的輸出。您可以模擬這種行爲與下面的測試:

[Test, Timeout(10000)] // Time out in 10 seconds 
public void Test_MyFunction_DoesNotRunForever() 
{ 
    DateTime start = DateTime.Now; 
    while (true) 
    { 
     TimeSpan runTime = DateTime.Now - start; 
     System.Diagnostics.Debug.WriteLine("Doing stuff for " + runTime.TotalSeconds + " seconds." + (runTime.TotalSeconds > 10 ? " Buggy! :(" : "")); 
    } 
} 

如果你看它跑,你會發現,它仍然打印輸出像Doing stuff for 2.043 seconds.分鐘已經過去了,即使之後。

如果你不想減少輸出,你應該放慢輸出速度,並放好一些像Thread.Sleep這樣的人工減速,最好不要改變你的代碼。即使Thread.Sleep(1)也足以防止這樣的積壓。浮現在腦海中的一些選項:

  • 如果你有嘲笑,你可以把一個短暫的停頓在模擬的回調
  • 重新組織你的代碼,以接受輸出匯作爲參數之一,所以你可以提供一個存根,添加一個簡短的暫停,然後傳遞輸出。
相關問題