2016-08-03 18 views
2

我想添加一個自定義測試記者到NUnit。我已經用NUnit2做了,但我現在需要使用NUnit3。如何在NUnit 3中使用ITestEventListener?

爲了實現記者,我需要從框架中獲取各種事件,例如測試的開始,結束和失敗。

在NUnit2我用NUnitHook註冊我EventListner和它的工作相當不錯。

在NUnit3中,我需要使用擴展點機制,但是當我將擴展點添加到項目時,VisualStudio(2012 ultimate)立即無法發現NUnit測試。

[TypeExtensionPoint(Description = "Test Reporter Extension")] 
    public class MyTestEventListener : ITestEventListener 
    { 

     public void OnTestEvent(string report) 
     { 
      Console.WriteLine(report); 
     } 

    } 

如果我從類中刪除ITestEventListener實現聲明,它完美地重新發現測試。

[TypeExtensionPoint(Description = "Test Reporter Extension")] 
    public class MyTestEventListener //: ITestEventListener 
    { 

     public void OnTestEvent(string report) 
     { 
      Console.WriteLine(report); 
     } 

    } 

我做錯了什麼?有沒有更好的方法來實現它?

回答

4

你不會說你把這段代碼放在哪裏,但我懷疑它在你的測試程序集中。如果是這樣,那不是它屬於的地方。 NUnit引擎擴展安裝到NUnit引擎中,因此它們需要位於單獨的程序集中。一旦你有一個單獨的程序集,你需要告訴引擎它在哪裏。目前,您可以通過在與引擎相同的目錄中創建類型爲.addins的文件來執行此操作。 (您可以修改現有文件,但會在將來引入維護問題)

未來的版本將會有一種更簡單的方式來安裝插件,但它們將繼續完全獨立於您的測試。

還有一個問題是您正在使用TypeExtensionPointAttribute。我沒有注意到這是最初在你的代碼中,這可能是最大的錯誤,所以我現在添加這個信息。

「擴展點」是你正在擴展的東西。 NUnit定義了ExtensionPoints,而您創建了Extenisons來擴展它們。在NUnit中使用TypeExtensionPointAttribute來定義擴展點。它不被你使用。您使用ExtensionAttribute來定義您的擴展。

你的擴展應該定義是這樣的:

[Extension(Description = "Test Reporter Extension", EngineVersion="3.4")] 
public class MyTestEventListener : ITestEventListener 
{ 
    public void OnTestEvent(string report) 
    { 
     Console.WriteLine(report); 
    } 
} 

你不說你正在運行的版本的NUnit。測試監聽器僅支持從版本3.4開始。以上的EngineVersion屬性純粹是紀錄片,因爲3.4也是第一個識別它的版本。

有一個在NUnit的文檔可能有用新新手必看:https://github.com/nunit/docs/wiki/Writing-Engine-Extensions

+0

我糾正我的答案,以反映用戶代碼使用錯誤的屬性的事實。 – Charlie

+1

謝謝,我已經成功地編寫了插件。現在問題是我需要它也從VS運行,我的理解是,它尚未支持。我期待着這項改進。 –

+1

通過使用NuGet安裝並在軟件包目錄中創建一個.addins文件,並在其中包含正確的相對路徑,可以使其在本地計算機上工作。但是它不能自動運行包恢復,這在很多環境中都是如此。除此之外,它必須等到適配器使用標準的引擎包,而不是現在的引擎的自定義副本。 – Charlie

相關問題