2016-08-03 36 views
2

Ich möchte einen benutzerdefinierten Testreporter zu NUnit hinzufügen. Ich habe es bereits mit NUnit2 gemacht, aber jetzt muss ich NUnit3 verwenden.Wie wird ITestEventListener in NUnit 3 verwendet?

Um den Reporter zu implementieren, muss ich verschiedene Ereignisse aus dem Framework, wie Start, Ende und Fehler der Tests erhalten.

In NUnit2 verwendete ich die NUnitHook mein EventListner und es funktionierte ziemlich gut zu registrieren.

In NUnit3 muss ich den Erweiterungspunktmechanismus verwenden, aber wenn ich den Erweiterungspunkt dem Projekt hinzufüge, kann VisualStudio (2012 ultimate) sofort die NUnit-Tests nicht entdecken.

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

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

    } 

Wenn ich die ITestEventListener Implementierung Erklärung aus der Klasse entfernen, neu entdeckt es die Tests perfekt.

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

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

    } 

Mache ich etwas falsch? Gibt es einen besseren Weg, es zu erreichen?

Antwort

4

Sie sagen nicht, wo Sie diesen Code setzen, aber ich vermute, dass es in Ihrer Testbaugruppe ist. Wenn ja, gehört es nicht dorthin, wo es hingehört. NUnit-Engineerweiterungen werden in der NUnit-Engine installiert, sodass sie sich in einer separaten Assembly befinden müssen. Sobald Sie eine separate Baugruppe haben, müssen Sie der Engine mitteilen, wo sie sich befindet. Derzeit erstellen Sie dazu eine Datei vom Typ .addins im selben Verzeichnis wie die Engine. (Sie könnten die vorhandene Datei ändern, aber das führt in Zukunft zu Wartungsproblemen)

Eine zukünftige Version wird einen einfacheren Weg zur Installation von Addins bieten, aber sie werden weiterhin völlig unabhängig von Ihren Tests sein. Ein weiteres Problem ist, dass Sie TypeExtensionPointAttribute verwenden. Ich habe das ursprünglich nicht in deinem Code bemerkt und es ist wahrscheinlich der größte Fehler, also füge ich diese Informationen jetzt hinzu.

Ein "ExtensionPoint" ist die Sache, die Sie erweitern. NUnit definiert ExtensionPoints, während Sie Extensions erstellen, um sie zu erweitern. TypeExtensionPointAttribute wird in NUnit verwendet, um Erweiterungspunkte zu definieren. Es wird nicht von dir benutzt. Sie verwenden die ExtensionAttribute, um Ihre Erweiterung zu definieren.

Ihre Erweiterung sollte wie folgt definiert werden:

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

Sie sagen nicht, welche Version von NUnit Sie ausgeführt werden. Test Listener werden erst ab Version 3.4 unterstützt. Die obige Eigenschaft EngineVersion ist an dieser Stelle rein dokumentarisch, denn 3.4 ist auch die erste Version, die es erkennt.

Es gibt eine neue Zuschreibung in den NUnit docs, die hilfreich sein können: https://github.com/nunit/docs/wiki/Writing-Engine-Extensions

+0

ich meine Antwort bin Korrektur um die Tatsache widerzuspiegeln, dass der Benutzer-Code das falsche Attribut verwendet. – Charlie

+1

Danke, mir ist es gelungen, das Addin zu schreiben. Jetzt ist das Problem, dass ich es auch von VS ausführen muss, und mein Verständnis ist, dass das noch nicht unterstützt wird. Ich freue mich auf diese Verbesserung. –

+1

Es kann wahrscheinlich gemacht werden, auf Ihrem lokalen Rechner zu arbeiten, indem Sie die NuGet-Installation verwenden und eine .addins-Datei im Paketverzeichnis mit dem richtigen relativen Pfad darin erstellen. Aber es würde nicht automatisch bei der Paketwiederherstellung funktionieren, was es in vielen Umgebungen ausschließt.Darüber hinaus muss es warten, bis der Adapter ein Standard-Engine-Paket anstelle einer benutzerdefinierten Kopie der Engine verwendet. – Charlie