Pourquoi TestInitialize est-il déclenché pour chaque test dans mes tests unitaires Visual Studio?

158

J'utilise Visual Studio 2010 Beta 2. J'en ai un [TestClass], qui a un [TestInitialize], [TestCleanup]et quelques-uns [TestMethods].

Chaque fois qu'une méthode de test est exécutée, les méthodes d'initialisation et de nettoyage sont également exécutées!

J'avais l'impression que le [TestInitialize]& [TestCleanup]ne devrait être exécuté qu'une seule fois, par essai local.

Est-ce exact? Sinon, quelle est la bonne façon de procéder?

Pure.Krome
la source

Réponses:

314

TestInitializeet TestCleanupsont exécutés avant et après chaque test, afin de garantir qu'aucun test n'est couplé.

Si vous souhaitez exécuter des méthodes avant et après TOUS les tests, décorez les méthodes pertinentes avec les attributs ClassInitializeet ClassCleanup.

Informations pertinentes du fichier de test généré automatiquement dans Visual Studio:

Vous pouvez utiliser les attributs supplémentaires suivants lorsque vous écrivez vos tests:

// 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
la source
9
et vous avez deux autres AssemblyInitialize et AssemblyCleanup comme mentionné ici stackoverflow.com/a/21304674/864201
Rodolpho Brock
12

il s'agit plutôt d'un comportement standard pour les suites de tests: configuration et démontage avant et après chaque test. La philosophie est que les tests ne doivent pas dépendre les uns des autres. Si vous voulez un autre comportement, vous devriez probablement utiliser des objets statiques qui persistent entre chaque test.

stijn
la source
9

Exemple complet tiré de la documentation 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
la source
-1

Les méthodes marquées avec l'attribut [TestInitialize ()] sont utilisées pour préparer les aspects de l'environnement dans lequel votre test unitaire s'exécutera. Le but est d'établir un état connu pour l'exécution de votre test unitaire. Vous pouvez utiliser la méthode [TestInitialize ()] pour copier, modifier ou créer certains fichiers de données que votre test utilisera.

Créez des méthodes marquées avec l'attribut [TestCleanUp {}] pour ramener l'environnement à un état connu après l'exécution d'un test. Cela peut signifier la suppression de fichiers dans des dossiers ou le retour d'une base de données à un état connu. Un exemple de ceci est de réinitialiser une base de données d'inventaire à un état initial après avoir testé une méthode utilisée dans une application de saisie de commande.

Pour plus d'informations, veuillez consulter: http://msdn.microsoft.com/en-us/library/ms182517%28v=vs.100%29.aspx

Pushkar Prabhu
la source