2011-06-21 45 views
3

nunit是否適用於多線程上下文。 我不想讓nunit測試我的多線程應用程序,但想要使用nunit聲明NUnit在單獨的線程中聲明

簡單示例 - 此測試爲「綠色」。我錯了什麼?

[Test] 
public void Test() 
{ 
    Action action = Async; 
    action.BeginInvoke(action.EndInvoke, null).AsyncWaitHandle.WaitOne(); 
} 

private void Async() 
{ 
    Assert.IsTrue(false); 
    Assert.DoesNotThrow(() => 
         { 
         Console.WriteLine("Async"); 
         throw new InvalidOperationException(); 
         }); 
} 

回答

6

NUnit測試運行器可執行文件配置爲忽略非測試線程上的異常。您可以通過的app.config配置元素配置此行爲:

legacyUnhandledExceptionPolicy

您可以配置非測試線程導致未處理的異常,所以測試將隨後失敗。需要注意的是,當另一個測試正在運行時,可能會產生非測試線程異常,所以您可能無法獲得的哪個測試失敗的準確圖片。另外,因爲這將是一個未處理的異常,測試執行將在發生異常時停止,而不是繼續,這是正常行爲。

雖然在我看來比忽略更好。

以下文章將對ReSharper測試運行器的主題進行一些詳細說明,但其原理相同。

ReSharper test runner – hidden thread exceptions

如果你具有多線程方面,從一個斷言點,我覺得最好設置標誌等非測試線程上,等待非測試線程來完成,然後在測試線程上斷言狀態。以這種方式在主線程上引發斷言異常,並按預期運行測試。

人爲的例子

[Test] 
    public void Test() 
    { 
     Exception ex = null; 

     Action test =() => 
     { 
      Console.WriteLine("Async"); 

      ex = new InvalidOperationException(); 
     }; 

     test.BeginInvoke(test.EndInvoke, null).AsyncWaitHandle.WaitOne(); 

     Assert.That(ex, Is.Null, "Exception did not happen."); 
    } 
0
Assert.IsTrue(false); 

會拋出DoesNotThrow調用之前異常。但NUnit不適用於多個線程。跨線程更接近UnitTest。一般來說,我會建議避免公開外部的線程/任務,並使用對象的內部行爲 - 以便您可以爲了測試目的而嘲笑這種行爲。