web-dev-qa-db-fra.com

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

J'utilise Visual Studio 2010 Beta 2. J'ai un seul [TestClass], qui a un [TestInitialize], [TestCleanup] et quelques [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 doit être exécuté qu'une seule fois, par test local.

Est-ce exact? Si non, quelle est la bonne façon de faire cela?

145
Pure.Krome

TestInitialize et TestCleanup sont exécutés avant et après chaque test, ceci afin de s'assurer 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 ClassInitialize et ClassCleanup.

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

Vous pouvez utiliser les attributs supplémentaires suivants lors de la rédaction de 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() { }
288
alexn

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 souhaitez un autre comportement, vous devez probablement utiliser des objets statiques qui persistent entre chaque test.

12
stijn

Exemple complet tiré du 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);
        }
    }
}
8
Rodolpho Brock