Dlaczego TestInitialize jest uruchamiany dla każdego testu w moich testach jednostkowych programu Visual Studio?

158

Używam Visual Studio 2010 Beta 2. Mam jeden [TestClass], który ma [TestInitialize], [TestCleanup]a kilka [TestMethods].

Za każdym razem, gdy uruchamiana jest metoda testowa, uruchamiane są RÓWNIEŻ metody inicjowania i czyszczenia!

Odniosłem wrażenie, że [TestInitialize]& [TestCleanup]powinno być uruchamiane tylko raz, podczas lokalnego testu.

Czy to jest poprawne? Jeśli nie, jaki jest właściwy sposób, aby to zrobić?

Pure.Krome
źródło

Odpowiedzi:

314

TestInitializei TestCleanupsą uruchamiane przed i po każdym teście, ma to na celu zapewnienie, że żadne testy nie zostaną połączone.

Jeśli chcesz uruchomić metody przed i po WSZYSTKICH testach, udekoruj odpowiednie metody atrybutami ClassInitializei ClassCleanup.

Istotne informacje z automatycznie generowanego pliku testowego w programie Visual Studio:

Podczas pisania testów możesz użyć następujących dodatkowych atrybutów:

// 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
źródło
9
i masz jeszcze dwa AssemblyInitialize i AssemblyCleanup, jak wspomniano tutaj stackoverflow.com/a/21304674/864201
Rodolpho Brock
12

jest to raczej standardowe zachowanie dla zestawów testów: konfiguracja i rozłączanie przed i po każdym teście. Filozofia jest taka, że ​​testy nie powinny od siebie zależeć. Jeśli chcesz innego zachowania, prawdopodobnie powinieneś użyć statycznych obiektów, które pozostają między każdym testem.

stijn
źródło
9

Pełny przykład zaczerpnięty z dokumentacji firmy Microsoft :

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
źródło
-1

Metody oznaczone atrybutem [TestInitialize ()] służą do przygotowania aspektów środowiska, w którym będzie wykonywany test jednostkowy. Ma to na celu ustalenie znanego stanu uruchamiania testu jednostkowego. Możesz użyć metody [TestInitialize ()], aby skopiować, zmienić lub utworzyć określone pliki danych, których użyje Twój test.

Utwórz metody, które są oznaczone atrybutem [TestCleanUp {}], aby przywrócić środowisko do znanego stanu po wykonaniu testu. Może to oznaczać usunięcie plików w folderach lub przywrócenie bazy danych do znanego stanu. Przykładem tego jest zresetowanie bazy danych zapasów do stanu początkowego po przetestowaniu metody używanej w aplikacji do wprowadzania zamówień.

Więcej informacji można znaleźć pod adresem : http://msdn.microsoft.com/en-us/library/ms182517%28v=vs.100%29.aspx

Pushkar Prabhu
źródło