¿Por qué se dispara TestInitialize por cada prueba en mis pruebas unitarias de Visual Studio?

158

Estoy usando Visual Studio 2010 Beta 2. Tengo una sola [TestClass], que tiene una [TestInitialize], [TestCleanup]y algunas [TestMethods].

¡Cada vez que se ejecuta un método de prueba, también se ejecutan los métodos de inicialización y limpieza!

Tenía la impresión de que [TestInitialize]& [TestCleanup]debería ejecutarse solo una vez, por ejecución de prueba local.

¿Es eso correcto? Si no, ¿cuál es la forma correcta de hacer esto?

Pure.Krome
fuente

Respuestas:

314

TestInitializey TestCleanupse ejecutan antes y después de cada prueba, esto es para garantizar que no haya pruebas acopladas.

Si desea ejecutar métodos antes y después de TODAS las pruebas, decore los métodos relevantes con los atributos ClassInitializey ClassCleanup.

Información relevante del archivo de prueba generado automáticamente en Visual Studio:

Puede usar los siguientes atributos adicionales mientras escribe sus pruebas:

// 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
fuente
9
y tiene dos más AssemblyInitialize y AssemblyCleanup como se menciona aquí stackoverflow.com/a/21304674/864201
Rodolpho Brock
12

Este es un comportamiento bastante estándar para los conjuntos de pruebas: configuración y desmontaje antes y después de cada prueba. La filosofía es que las pruebas no deberían depender unas de otras. Si desea otro comportamiento, probablemente debería usar objetos estáticos que persistan entre cada prueba.

stijn
fuente
9

Ejemplo completo tomado de la documentación de 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
fuente
-1

Los métodos marcados con el atributo [TestInitialize ()] se utilizan para preparar aspectos del entorno en el que se ejecutará la prueba de la unidad. El propósito de esto es establecer un estado conocido para ejecutar su prueba de unidad. Puede usar el método [TestInitialize ()] para copiar, alterar o crear ciertos archivos de datos que usará su prueba.

Cree métodos marcados con el atributo [TestCleanUp {}] para devolver el entorno a un estado conocido después de que se haya ejecutado una prueba. Esto podría significar la eliminación de archivos en carpetas o el retorno de una base de datos a un estado conocido. Un ejemplo de esto es restablecer una base de datos de inventario a un estado inicial después de probar un método que se utiliza en una aplicación de entrada de pedidos.

Para obtener más información, consulte: http://msdn.microsoft.com/en-us/library/ms182517%28v=vs.100%29.aspx

Pushkar Prabhu
fuente