VS-Team-Test: Mehrere Test-Initialisierungsmethoden in der Testklasse

8

Ich habe UnitTest-Projekt namens "MyClassTest" in TeamTest. Dieses Projekt hat drei Testmethoden. Jede Methode benötigt eigene Testinitialisierungsschritte. Wenn ich jedoch TestInitializeAttribute auf drei Initialisierungsmethoden anwende, wird das Attribut nicht mehr als einmal verwendet. Was sollte dann das zu verwendende Attribut sein, um jede Testmethode in Visual Studio Team Test zu initialisieren?

Referenz:

  1. VS Team Test: Testen der .Net-Einheit mit Excel als Datenquelle: Adapter fehlgeschlagen

  2. Wie? Erstellen Sie Startup und Cleanup-Skript für Visual Studio Test Project?

  3. VS 2010 lädt Tests mit benutzerdefinierten Zählern

  4. Wie wird der Unit-Test-Eintrag protokolliert? und gehe in MSTest

  5. Kann a Unit Test-Projekt laden Sie die App.config-Datei der Zielanwendung?

Lijo 22.05.2012, 10:01
quelle

5 Antworten

18

Nach MSDN das TestInitializeAttribute :

  • kann nicht mehrfach verwendet werden ( AllowMultiple = false ) und
  • kann nicht vererbt werden, um Ihre eigene TestInitializeAttribute .
  • zu erstellen

Also, mein Vorschlag ist, die Methode Test Initialize ohne das Attribut TestInitialize zu erstellen. Dann prüfe in der einzigartigen TestInitialize -Methode, welches der aktuell ausgeführte TestMethod ist und rufe die entsprechende Initialisierungsmethode auf:

%Vor%     
Schaliasos 22.05.2012, 10:33
quelle
11

Wenn Sie drei Testmethoden haben und jede Methode eigene Initialisierungsschritte hat , warum verschieben Sie dann die Initialisierung in die Methode, die vor jedem Test ausgeführt wird? Nur ein Vorteil, den ich sehe, ist dieser nette Schalterblock, der Ihrer Quelldatei einige Zeilen hinzufügt. Aber es gibt Ihnen einen Nachteil - wenn Sie auf eine dieser Testmethoden schauen, können Sie nicht wirklich sagen, in welchem ​​Kontext die Methode ausgeführt wird. Also verwende ich die Initialisierungsmethode, um nur den Basiskontext einzurichten, der wirklich von allen Tests in der Fixture verwendet wird.

Verschieben Sie einfach die Kontexterstellung in arrange -Teil jeder Methode.

Wenn Sie mehrere Methoden verwenden, die den allgemeinen Kontext verwenden, dann extrahieren Sie einfach die Methode, die den Kontext für sie einrichtet, und rufen Sie sie im arrange -Teil auf. Sie können auch jedes Kontext-Setup in mehrere Schritte aufteilen und diese Schritte wiederverwenden (wie bei Tools, die zu einem bestimmten Zeitpunkt vorhanden sind, wie Specflow ).

Und natürlich, verschiedene Fixtures auch Option zu erstellen.

    
Sergey Berezovskiy 22.05.2012 12:35
quelle
4

Es ist ein bisschen wie ein alter Post, aber ich habe folgendes gefunden, was gut zu funktionieren scheint: Definieren Sie zuerst eine Attributklasse:

%Vor%

Definieren Sie dann eine Erweiterungsmethode in einer praktischen Utility-Klasse:

%Vor%

Schreiben Sie nun Ihre Tests, also:

%Vor%     
Dave 27.01.2015 16:44
quelle
3

Wenn sie drei separate Eingänge benötigen; dann sollten sie wahrscheinlich in drei separaten Fixtures sein, jede mit ihrer eigenen Init!

    
Dave Lawrence 22.05.2012 10:26
quelle
2

Bei meinem Job übergeben wir ein Argument an die TestInitialize-Methode, um zu bestimmen, wie die Initialisierung funktionieren soll.

%Vor%

Wir haben dann eine Standardinitialisierung in der Klassendefinition, die standardmäßig auf "false" gesetzt ist.

%Vor%

Dann können Sie in den Testfällen selbst die TestInitialize für einen beliebigen Test überschreiben.

%Vor%

Wir verwenden einen booleschen Wert, um festzustellen, ob der Admin-Test einen zusätzlichen Overhead für die Einrichtung benötigt. Nehmen Sie dies und wenden Sie die gewünschten Variablen auf eine Weise an, die Ihnen eine mehrfache Initialisierung durch die Verwendung einer Methode ermöglicht.

    
Tim Poindexter 21.03.2017 14:49
quelle