Perché TestInitialize viene attivato per ogni test nei test delle unità di Visual Studio?


158

Sto usando Visual Studio 2010 Beta 2. Ho un singolo [TestClass], che ha un [TestInitialize], [TestCleanup]e alcuni [TestMethods].

Ogni volta che viene eseguito un metodo di prova, vengono eseguiti ANCHE i metodi di inizializzazione e pulizia!

Ho avuto l'impressione che il [TestInitialize]e [TestCleanup]dovrebbe essere eseguito solo una volta, per ogni test di prova locale.

È corretto? In caso contrario, qual è il modo corretto per farlo?

Risposte:


314

TestInitializee TestCleanupvengono eseguiti prima e dopo ogni test, questo per garantire che nessun test sia accoppiato.

Se si desidera eseguire metodi prima e dopo TUTTI i test, decorare i metodi pertinenti con gli attributi ClassInitializee ClassCleanup.

Informazioni rilevanti dal file di test generato automaticamente in Visual Studio:

È possibile utilizzare i seguenti attributi aggiuntivi durante la scrittura dei test:

// 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() { }

9
e si dispone di altri due AssemblyInitialize e AssemblyCleanup come accennato qui stackoverflow.com/a/21304674/864201
Rodolpho Brock

12

questo è un comportamento piuttosto standard per le suite di test: impostazione e smontaggio prima e dopo ogni test. La filosofia è che i test non dovrebbero dipendere l'uno dall'altro. Se si desidera un altro comportamento, è consigliabile utilizzare oggetti statici che persistono tra un test e l'altro.


9

Esempio completo tratto dalla documentazione di 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);
        }
    }
}

-1

I metodi contrassegnati con l'attributo [TestInitialize ()] vengono utilizzati per preparare aspetti dell'ambiente in cui verrà eseguito il test dell'unità. Lo scopo è quello di stabilire uno stato noto per l'esecuzione del test unitario. È possibile utilizzare il metodo [TestInitialize ()] per copiare, alterare o creare determinati file di dati che verranno utilizzati dal test.

Creare metodi contrassegnati con l'attributo [TestCleanUp {}] per riportare l'ambiente a uno stato noto dopo l'esecuzione di un test. Ciò potrebbe significare la cancellazione di file nelle cartelle o il ritorno di un database a uno stato noto. Un esempio di ciò è reimpostare un database di inventario su uno stato iniziale dopo aver testato un metodo utilizzato in un'applicazione di inserimento ordini.

Per ulteriori informazioni, consultare: http://msdn.microsoft.com/en-us/library/ms182517%28v=vs.100%29.aspx

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.