119

J'utilise Visual Studio 2010 Beta 2. J'ai un seul [TestClass], qui a un [TestInitialize], [TestCleanup] et quelques [TestMethods].Pourquoi TestInitialize est-il déclenché pour chaque test dans mes tests unitaires Visual Studio?

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 correct? Sinon, quelle est la bonne façon de faire cela?

Répondre

241

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 appropriées avec les attributs ClassInitialize et ClassCleanup.

Les informations pertinentes de l'auto généré fichier de test dans Visual Studio:

Vous pouvez utiliser les attributs suivants que 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() { } 
+4

et vous avez deux autres AssemblyInitialize et AssemblyCleanup comme mentionné ici http://stackoverflow.com/a/21304674/864201 –

+2

Will TestInitialize exécuté pour les tests marqués [Ignorer]? –

10

Ce comportement est plutôt 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 l'un de l'autre. Si vous voulez un autre comportement, vous devez probablement utiliser des objets statiques qui persistent entre chaque test.

-1

méthodes qui sont marqués avec [TestInitialize() ] attribut sont utilisés pour préparer les aspects de l'environnement dans lequel votre test unitaire va s'exécuter. Le but de ceci est d'établir un état connu pour exécuter 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 renvoyer 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 dans 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 qui est utilisée dans une application d'entrée de commande.

Pour plus d'informations s'il vous plaît consulter: http://msdn.microsoft.com/en-us/library/ms182517%28v=vs.100%29.aspx

5

Exemple complet

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); 
     } 
    } 
} 
Questions connexes