È possibile eseguire il codice una volta prima che vengano eseguiti tutti i test?


112

Fondamentalmente vorrei dire a MSTest di eseguire un po 'di codice prima di avviare una serie di esecuzioni di test, essenzialmente quello che vorrei fare è la stessa cosa che inserire del codice Main().

Il motivo per cui vorrei farlo è che vorrei eseguire alcuni log con log4net durante i miei test di integrazione. Non posso semplicemente usare l' log4net.Config.XmlConfiguratorattributo assembly poiché nel momento in cui lo legge nel mio assembly di test è già stato chiamato LoggerManager. La documentazione consiglia di configurare log4net in modo esplicito al punto di ingresso del codice, ma dov'è nei miei test?

Devo essere in grado di eseguire i miei test in TestDriven.NET e MSTest runner.

Risposte:


153

FWIW, è possibile utilizzare l' attributo AssemblyInitialize per eseguire il codice prima che vengano eseguiti tutti gli unit test in un assembly:

[TestClass]
public class SetupAssemblyInitializer
{
    [AssemblyInitialize]
    public static void AssemblyInit(TestContext context)
    {
        // Initalization code goes here
    }
}

Se hai più di un assembly di unit test, non sono a conoscenza di nulla che comprenda più di un assembly.

Per quanto ne so, questo è il più vicino possibile a un equivalente principale.

Si noti che il AssemblyInitializemetodo di -decorated deve essere in una TestClassclasse di -decorated che contiene almeno un TestMethodmetodo -decorated, altrimenti non viene eseguito!


1
Ho avuto un problema simile (solo per MSTest) e ha funzionato bene. Grazie :)
Oscar Foley

1
Per chiunque altro abbia problemi con questo funzionamento sia da MsTest che da TestDriven.NET, è possibile utilizzare un flag statico per determinare se eseguire il codice in ClassInitialize (questo non funziona in MsTest).
Carl

7
Nota: il motore di test esegue un metodo contrassegnato con l'attributo AssemblyInitialize solo se tale metodo è un membro di una classe contrassegnata con l'attributo TestClass.
Jowen

5
@ Jowen: il motore di test esegue un metodo contrassegnato con l'attributo AssemblyInitialize solo se tale metodo è un membro di una classe contrassegnata con l'attributo TestClass and contains methods that are marked with the TestMethod attribute.
dal

3
Il metodo contrassegnato con AssemblyInitialize verrà eseguito in Visual Studio 2015 Ultimate senza altri metodi contrassegnati con attributi TestMethod.
Chris

63

Per il completamento, queste sono le opzioni "Esegui codice prima" per MSTest:

  • Utilizzare [AssemblyInitialize]per eseguire il codice una volta per assembly, prima di eseguire qualsiasi test in quell'assembly.
  • Utilizzare [ClassInitialize]per eseguire il codice una volta per classe, prima di qualsiasi test nella classe in cui è definito il metodo.
  • Utilizzare [TestInitialize]per eseguire il codice prima di ogni test nella classe in cui è definito il metodo.

12
La controparte di pulizia di questi attributi è il suffisso di pulizia (ad esempio ClassCleanup) per le operazioni di smontaggio
Yair Nevet

13

Lo vedo nell'intestazione del test MS.

// Use ClassInitialize to run code before running the first test in the class
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext) { }

Questo verrebbe eseguito prima dei test in una classe.

Sembra che tu voglia eseguire qualcosa prima di tutti i test.

C'è anche l'opzione dello script di installazione nella configurazione dell'esecuzione di prova.


A meno che non mi manchi qualcosa, gli script di installazione non aiutano con l'esecuzione del codice nell'AppDomain di prova.
George Mauer

2
Probabilmente sono io. Non sono sicuro di seguirti quando dici "codice in esecuzione nel test AppDomain.". Ho letto la tua domanda come se volessi eseguire codice prima di una serie di test, se fosse qualcos'altro che è diverso. "Gli script di installazione e gli script di pulizia vengono eseguiti prima e dopo l'esecuzione dei test, indipendentemente dai tipi di test contenuti in tali esecuzioni di test." msdn.microsoft.com/en-us/library/ms182480%28VS.80%29.aspx
Maestro1024
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.