Por que o TestInitialize é acionado para todos os testes nos meus testes de unidade do Visual Studio?

158

Estou usando o Visual Studio 2010 Beta 2. Tenho um único [TestClass] , que tem um [TestInitialize], [TestCleanup]e alguns [TestMethods].

Sempre que um método de teste é executado, os métodos de inicialização e limpeza também são executados!

Fiquei com a impressão de que o [TestInitialize]& [TestCleanup]só deveria ser executado uma vez, por execução de teste local.

Isso está correto? Caso contrário, qual é a maneira correta de fazer isso?

Pure.Krome
fonte

Respostas:

314

TestInitialize e TestCleanup são executados antes e após cada teste, isso garante que nenhum teste seja acoplado.

Se você deseja executar métodos antes e depois de TODOS os testes, decore os métodos relevantes com os ClassInitializebotõesClassCleanup atributos.

Informações relevantes do arquivo de teste gerado automaticamente no Visual Studio:

Você pode usar os seguintes atributos adicionais ao escrever seus testes:

// 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
fonte
9
e você tem mais dois AssemblyInitialize e AssemblyCleanup como mencionado aqui stackoverflow.com/a/21304674/864201
Rodolpho Brock
12

esse é um comportamento bastante padrão para os conjuntos de testes: configuração e desmontagem antes e após cada teste. A filosofia é que os testes não devem depender um do outro. Se você deseja outro comportamento, provavelmente deve usar objetos estáticos que persistem entre cada teste.

stijn
fonte
9

Exemplo completo retirado da documentação da 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
fonte
-1

Os métodos marcados com o atributo [TestInitialize ()] são usados ​​para preparar aspectos do ambiente em que seu teste de unidade será executado. O objetivo disso é estabelecer um estado conhecido para executar seu teste de unidade. Você pode usar o método [TestInitialize ()] para copiar, alterar ou criar determinados arquivos de dados que seu teste usará.

Crie métodos marcados com o atributo [TestCleanUp {}] para retornar o ambiente a um estado conhecido após a execução de um teste. Isso pode significar a exclusão de arquivos em pastas ou o retorno de um banco de dados a um estado conhecido. Um exemplo disso é redefinir um banco de dados de inventário para um estado inicial após testar um método usado em um aplicativo de entrada de pedidos.

Para obter mais informações, consulte: http://msdn.microsoft.com/en-us/library/ms182517%28v=vs.100%29.aspx

Pushkar Prabhu
fonte