Warum wird TestInitialize für jeden Test in meinen Visual Studio-Komponententests ausgelöst?

158

Ich bin mit Visual Studio 2010 Beta 2. Ich habe einen einzigen bekam [TestClass], die eine hat [TestInitialize], [TestCleanup]und ein paar[TestMethods] .

Jedes Mal, wenn eine Testmethode ausgeführt wird, werden AUCH die Initialisierungs- und Bereinigungsmethoden ausgeführt!

Ich hatte den Eindruck, dass das [TestInitialize]&[TestCleanup] pro lokalem Testlauf nur einmal ausgeführt werden sollte.

Ist das korrekt? Wenn nicht, wie geht das richtig?

Pure.Krome
quelle

Antworten:

314

TestInitializeund TestCleanupwerden vor und nach jedem Test ausgeführt, um sicherzustellen, dass keine Tests gekoppelt sind.

Wenn Sie Methoden vor und nach ALLEN Tests ausführen möchten, dekorieren Sie relevante Methoden mit den Attributen ClassInitializeund ClassCleanup.

Relevante Informationen aus der automatisch generierten Testdatei in Visual Studio:

Sie können beim Schreiben Ihrer Tests die folgenden zusätzlichen Attribute verwenden:

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

// Use ClassCleanup to run code after all tests in a class have run
[ClassCleanup()]
public static void MyClassCleanup() { }

// Use TestInitialize to run code before running each test 
[TestInitialize()]
public void MyTestInitialize() { }

// Use TestCleanup to run code after each test has run
[TestCleanup()]
public void MyTestCleanup() { }
alexn
quelle
9
und Sie haben zwei weitere AssemblyInitialize und AssemblyCleanup, wie hier erwähnt stackoverflow.com/a/21304674/864201
Rodolpho Brock
12

Dies ist eher ein Standardverhalten für Testsuiten: Einrichtung und Abbau vor und nach jedem Test. Die Philosophie ist, dass Tests nicht voneinander abhängen sollten. Wenn Sie ein anderes Verhalten wünschen, sollten Sie wahrscheinlich statische Objekte verwenden, die zwischen den einzelnen Tests bestehen bleiben.

stijn
quelle
9

Vollständiges Beispiel aus der Microsoft-Dokumentation :

using Microsoft.VisualStudio.TestTools.UnitTesting;
using SampleClassLib;
using System;
using System.Windows.Forms;

namespace TestNamespace
{
    [TestClass()]
    public sealed class DivideClassTest
    {
        [AssemblyInitialize()]
        public static void AssemblyInit(TestContext context)
        {
            MessageBox.Show("AssemblyInit " + context.TestName);
        }

        [ClassInitialize()]
        public static void ClassInit(TestContext context)
        {
            MessageBox.Show("ClassInit " + context.TestName);
        }

        [TestInitialize()]
        public void Initialize()
        {
            MessageBox.Show("TestMethodInit");
        }

        [TestCleanup()]
        public void Cleanup()
        {
            MessageBox.Show("TestMethodCleanup");
        }

        [ClassCleanup()]
        public static void ClassCleanup()
        {
            MessageBox.Show("ClassCleanup");
        }

        [AssemblyCleanup()]
        public static void AssemblyCleanup()
        {
            MessageBox.Show("AssemblyCleanup");
        }

        [TestMethod()]
        [ExpectedException(typeof(System.DivideByZeroException))]
        public void DivideMethodTest()
        {
            DivideClass.DivideMethod(0);
        }
    }
}
Rodolpho Brock
quelle
-1

Mit dem Attribut [TestInitialize ()] gekennzeichnete Methoden werden verwendet, um Aspekte der Umgebung vorzubereiten, in der Ihr Komponententest ausgeführt wird. Damit soll ein bekannter Status für die Ausführung Ihres Komponententests festgelegt werden. Sie können die Methode [TestInitialize ()] verwenden, um bestimmte Datendateien zu kopieren, zu ändern oder zu erstellen, die Ihr Test verwenden wird.

Erstellen Sie Methoden, die mit dem Attribut [TestCleanUp {}] gekennzeichnet sind, um die Umgebung nach dem Ausführen eines Tests in einen bekannten Zustand zurückzusetzen. Dies kann das Löschen von Dateien in Ordnern oder die Rückkehr einer Datenbank in einen bekannten Zustand bedeuten. Ein Beispiel hierfür ist das Zurücksetzen einer Inventardatenbank auf einen Anfangszustand nach dem Testen einer Methode, die in einer Auftragserfassungsanwendung verwendet wird.

Weitere Informationen finden Sie unter: http://msdn.microsoft.com/en-us/library/ms182517%28v=vs.100%29.aspx

Pushkar Prabhu
quelle