Diese Frage bezieht sich auf das Unit-Test-Framework xUnit.net .
Ich muss Code ausführen, bevor ein Test ausgeführt wird, und auch Code, nachdem alle Tests durchgeführt wurden. Ich dachte, es sollte eine Art Attribut- oder Markierungsschnittstelle geben, um den globalen Initialisierungs- und Beendigungscode anzuzeigen, konnte sie aber nicht finden.
Wenn ich xUnit programmgesteuert aufrufe, kann ich alternativ auch mit dem folgenden Code das erreichen, was ich will:
static void Main()
{
try
{
MyGlobalSetup();
RunAllTests(); // What goes into this method?
}
finally
{
MyGlobalTeardown();
}
}
Kann mir jemand einen Hinweis geben, wie ein globaler Setup- / Teardown-Code deklarativ oder programmgesteuert ausgeführt werden kann?
Antworten:
Soweit ich weiß, verfügt xUnit nicht über einen globalen Initialisierungs- / Teardown-Erweiterungspunkt. Es ist jedoch einfach, eine zu erstellen. Erstellen
IDisposable
Sie einfach eine Basistestklasse, die Ihre Initialisierung im Konstruktor und Ihren Abbau in derIDisposable.Dispose
Methode implementiert und durchführt . Das würde so aussehen:Der Setup- und Teardown-Code für die Basisklasse wird jedoch für jeden Aufruf ausgeführt. Dies ist möglicherweise nicht das, was Sie möchten, da es nicht sehr effizient ist. Eine optimierte Version würde die
IClassFixture<T>
Schnittstelle verwenden, um sicherzustellen, dass die globale Initialisierungs- / Teardown-Funktionalität nur einmal aufgerufen wird. In dieser Version erweitern Sie keine Basisklasse aus Ihrer Testklasse, sondern implementieren dieIClassFixture<T>
Schnittstelle, dieT
sich auf Ihre Fixture-Klasse bezieht:Dies führt dazu, dass der Konstruktor
TestsFixture
für jede zu testende Klasse nur einmal ausgeführt wird. Es kommt also darauf an, was genau Sie zwischen den beiden Methoden wählen möchten.quelle
[Collection("<name>")]
Ich habe nach der gleichen Antwort gesucht, und zu diesem Zeitpunkt ist die xUnit-Dokumentation sehr hilfreich bei der Implementierung von Klassen- und Sammlungsvorrichtungen, die Entwicklern eine breite Palette von Einrichtungs- / Abbaufunktionen auf Klassen- oder Klassengruppenebene bieten. Dies steht im Einklang mit der Antwort von Geir Sagberg und bietet eine gute Skelettimplementierung, um zu veranschaulichen, wie es aussehen sollte.
https://xunit.github.io/docs/shared-context.html
quelle
Collection
Attribut dekorieren müssen, damit das "globale" Setup stattfinden kann. Das heißt, wenn Sie vor dem Ausführen von -any- test etwas einrichten möchten, müssen Sie -all- Testklassen mit diesem Attribut dekorieren. Dies ist meiner Meinung nach zu spröde, da das Vergessen, eine einzelne Testklasse zu dekorieren, zu Fehlern führen kann, die schwer zu finden sind. Es wäre schön, wenn xUnit einen Weg zu einem wirklich globalen Setup und Teardown schaffen würde.Es gibt eine einfache Lösung. Verwenden Sie das Fody.ModuleInit-Plugin
https://github.com/Fody/ModuleInit
Es ist ein Nuget-Paket und fügt bei der Installation eine neue Datei hinzu
ModuleInitializer.cs
, die dem Projekt aufgerufen wird . Hier gibt es eine statische Methode, die nach dem Erstellen in die Baugruppe eingewebt wird und ausgeführt wird, sobald die Baugruppe geladen wird und bevor etwas ausgeführt wird.Ich verwende dies, um die Softwarelizenz für eine von mir gekaufte Bibliothek freizuschalten. Ich habe immer vergessen, die Lizenz in jedem Test freizuschalten und sogar zu vergessen, den Test von einer Basisklasse abzuleiten, die ihn entsperren würde. Die hellen Funken, die diese Bibliothek geschrieben haben, führten zu subtilen numerischen Fehlern, die dazu führten, dass Tests fehlschlugen oder bestanden wurden, wenn sie nicht sollten. Sie würden nie erfahren, ob Sie die Bibliothek korrekt entsperrt haben oder nicht. So sieht jetzt mein Modul init aus
Bei allen Tests, die in diese Assembly gestellt werden, wird die Lizenz für sie ordnungsgemäß entsperrt.
quelle
Um SetUp / TearDown-Code für mehrere Klassen freizugeben, können Sie das CollectionFixture von xUnit verwenden .
Zitat:
quelle