Ist es möglich, Code einmal auszuführen, bevor alle Tests ausgeführt werden?

112

Grundsätzlich möchte ich MSTest anweisen, vor dem Start einer Reihe von Testläufen ein wenig Code auszuführen. Im Wesentlichen möchte ich das Gleiche tun, als Code einzufügen Main().

Der Grund, warum ich dies tun möchte, ist, dass ich während meiner Integrationstestläufe eine Protokollierung mit log4net durchführen möchte. Ich kann das log4net.Config.XmlConfiguratorAssembly-Attribut nicht einfach verwenden , da es zum Zeitpunkt des Lesens in meiner Testassembly bereits aufgerufen wurde LoggerManager. In der Dokumentation wird empfohlen, log4net explizit am Codeeingabepunkt zu konfigurieren - aber wo ist das in meinen Tests?

Ich muss in der Lage sein, meine Tests in TestDriven.NET und MSTest Runner auszuführen.

George Mauer
quelle

Antworten:

153

FWIW, Sie können das AssemblyInitialize- Attribut verwenden, um Code auszuführen, bevor alle Komponententests in einer Assembly ausgeführt werden:

[TestClass]
public class SetupAssemblyInitializer
{
    [AssemblyInitialize]
    public static void AssemblyInit(TestContext context)
    {
        // Initalization code goes here
    }
}

Wenn Sie mehr als eine Testeinheit haben, ist mir nichts bekannt, das mehr als eine Baugruppe umfasst.

Soweit mir bekannt ist, ist dies so nah wie möglich an einem Hauptäquivalent.

Beachten Sie, dass sich die AssemblyInitialize-decorated-Methode in einer -decorated-Klasse befinden muss , TestClassdie mindestens eine TestMethod-decorated-Methode enthält, da sie sonst nicht ausgeführt wird!

Mark Seemann
quelle
1
Ich hatte ein ähnliches Problem (nur für MSTest) und funktionierte gut. Danke :)
Oscar Foley
1
Für alle anderen, die Probleme damit haben, dass dies sowohl in MsTest als auch in TestDriven.NET funktioniert, können Sie mithilfe eines statischen Flags bestimmen, ob der Code in ClassInitialize ausgeführt werden soll (dies funktioniert in MsTest nicht).
Carl
7
Hinweis: Die Test-Engine führt eine Methode aus, die nur mit dem AssemblyInitialize-Attribut gekennzeichnet ist, wenn diese Methode Mitglied einer Klasse ist, die mit dem TestClass-Attribut gekennzeichnet ist.
Jowen
5
@Jowen: Die Test-Engine führt eine Methode aus, die nur mit dem AssemblyInitialize-Attribut gekennzeichnet ist, wenn diese Methode Mitglied einer Klasse ist, die mit dem TestClass-Attribut gekennzeichnet ist and contains methods that are marked with the TestMethod attribute.
oɔɯǝɹ
3
Mit AssemblyInitialize gekennzeichnete Methoden werden in Visual Studio 2015 Ultimate ohne andere mit TestMethod-Attributen gekennzeichnete Methoden ausgeführt.
Chris
63

Zum Abschluss sind dies die Optionen "Code vor ausführen" für MSTest:

  • Verwenden Sie [AssemblyInitialize]diese Option , um Code einmal pro Assembly auszuführen, bevor ein Test in dieser Assembly ausgeführt wird.
  • Verwenden Sie [ClassInitialize]diese Option , um Code einmal pro Klasse vor jedem Test in der Klasse auszuführen, in der die Methode definiert ist.
  • Verwenden Sie [TestInitialize]diese Option , um Code vor jedem Test in der Klasse auszuführen, in der die Methode definiert ist.
Konamiman
quelle
12
Das Bereinigungsgegenstück dieser Attribute ist das Bereinigungssuffix (z. B. ClassCleanup) für
Abreißvorgänge
13

Ich sehe dies im MS Test-Header.

// Use ClassInitialize to run code before running the first test in the class
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext) { }

Dies würde vor den Tests in einer Klasse laufen.

Klingt so, als ob Sie vor allen Tests etwas ausführen möchten.

Es gibt auch die Setup-Skriptoption in der Testlaufkonfiguration.

Maestro1024
quelle
Sofern mir nichts fehlt, helfen Setup-Skripte nicht beim Ausführen von Code in der Test-AppDomain.
George Mauer
2
Ich bin es wahrscheinlich. Ich bin nicht sicher, ob ich Ihnen folge, wenn Sie "Code in der Test-AppDomain ausführen" sagen. Ich habe Ihre Frage so gelesen, dass Sie vor einer Reihe von Tests Code ausführen möchten, wenn es sich um etwas anderes handelt. "Setup-Skripte und Bereinigungsskripte werden vor und nach Testläufen ausgeführt, unabhängig von den Testtypen, die in diesen Testläufen enthalten sind." msdn.microsoft.com/en-us/library/ms182480%28VS.80%29.aspx
Maestro1024