119

Sto utilizzando Visual Studio 2010 Beta 2. Ho un singolo [TestClass], che ha un [TestInitialize], [TestCleanup] e alcuni [TestMethods].Perché TestInitialize viene attivato per ogni test nei test dell'unità di Visual Studio?

Ogni volta che viene eseguito un metodo di prova, vengono eseguiti anche i metodi di inizializzazione e pulizia!

Ho avuto l'impressione che il [TestInitialize] & [TestCleanup] debba essere eseguito una sola volta, per prova di test locale.

È corretto? In caso contrario, qual è il modo corretto per farlo?

risposta

241

TestInitialize e TestCleanup vengono eseguiti prima e dopo ogni test, questo per garantire che nessun test sia accoppiato.

Se si desidera eseguire i metodi prima e dopo TUTTI i test, decorare i metodi pertinenti con gli attributi ClassInitialize e ClassCleanup.

informazioni pertinenti l'auto generato test-file in Visual Studio:

È possibile utilizzare i seguenti attributi aggiuntivi come si scrivono i test:

// 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

e si dispone di più di due AssemblyInitialize e AssemblyCleanup come accennato qui http://stackoverflow.com/a/21304674/864201 –

+2

Will TestInitialize eseguito per i test contrassegnati [Ignora]? –

10

questo è un comportamento piuttosto standard per le suite di test: installazione e smontaggio prima e dopo ogni test. La filosofia è che i test non dovrebbero dipendere l'uno dall'altro. Se vuoi un altro comportamento, dovresti probabilmente usare oggetti statici che persistono tra ogni test.

-1

I metodi che sono contrassegnati con [TestInitialize() ] Gli attributi vengono utilizzati per preparare aspetti dell'ambiente in cui verrà eseguito il test dell'unità. Lo scopo di questo è stabilire uno stato noto per l'esecuzione del test dell'unità. È possibile utilizzare il metodo [TestInitialize()] per copiare, modificare o creare determinati file di dati che verranno utilizzati dal test.

Creare metodi contrassegnati con l'attributo [TestCleanUp {}] per restituire l'ambiente a uno stato noto dopo l'esecuzione di un test. Ciò potrebbe significare la cancellazione di file nelle cartelle o il ritorno di un database a uno stato conosciuto. Un esempio di ciò è reimpostare un database di inventario in uno stato iniziale dopo aver verificato un metodo che viene utilizzato in un'applicazione di immissione ordini.

Per maggiori informazioni consultare: http://msdn.microsoft.com/en-us/library/ms182517%28v=vs.100%29.aspx

5

esempio completa

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); 
     } 
    } 
} 
Problemi correlati