2009-03-12 5 views
25

È possibile eseguire un metodo specifico prima di ogni test in un assieme?MsTest - metodo di esecuzione prima di ogni test in un assieme

Conosco l'attributo TestInitialize ma questo attributo ha "ambito classe". Se è definito in una classe di test, verrà eseguito prima di ogni test di questa classe.

Desidero definire un metodo che verrà eseguito prima di ogni test definito in un intero assieme.

risposta

11

Non sono sicuro che questa funzione sia possibile in MsTest out of box come in altri framework di test (ad esempio MbUnit).

Se devo utilizzare MsTest, risolverlo definendo la classe astratta TestBase con l'attributo [TestInitialize] e ogni test che richiede questo comportamento deriva da questa classe di base. Nel tuo caso, ogni classe di test nell'assembly deve ereditare da questa base ...

E c'è probabilmente un'altra soluzione, puoi rendere il tuo attributo test personalizzato - ma non l'ho ancora provato ... :)

0

Penso che stiate cercando l'attributo ClassInitialize.

+2

ClassInitialize viene eseguito una volta per tutte le classi. Quindi, se abbiamo 5 test in classe, il metodo con ClassInitialize viene eseguito una volta. – brzozow

+2

Sì, probabilmente intendeva TestInitialize. –

1

Bene non è MSTest che istanzia la classe per ogni test? Questa è stata la mia comprensione. In tal caso, qualsiasi cosa tu chiami dal costruttore è il codice di inizializzazione (per test per definizione).

MODIFICA: se non funziona (cosa che ritengo ancora dovrebbe essere perché MSTest ha bisogno di assicurarsi che il metodo di test individuale venga eseguito separatamente) allora TestInitialize è il tuo attributo. A proposito, il confronto dei test unitari migliori è disponibile a Link on Codeplex

+0

Voglio scrivere il codice che verrà eseguito prima di tutti i test in tutte le classi di test. Quindi la tua soluzione funzionerà solo su una classe di test – brzozow

+0

No, non è vero. Se è vero che il cablaggio MSTest istanziaerà una nuova istanza di classe di test per test (che ritengo sia vera per lo scopo di isolamento del test), allora il codice nel costruttore viene eseguito prima di ogni metodo di test. –

+0

È vero quello che stai scrivendo ma non risolve il mio problema. Voglio resettare alcune proprietà statiche prima di ogni test (so che è una cattiva progettazione). Ho 400 classi con test unitari. Non voglio scrivere quel codice in tutte le classi. – brzozow

52

[TestInitialize()] è quello che ti serve.

private string dir; 

[TestInitialize()] 
public void Startup() 
{ 
    dir = Path.GetTempFileName(); 
    MakeDirectory(ssDir); 
} 

[TestCleanup()] 
public void Cleanup() 
{ 
    ss = null; 
    Directory.SetCurrentDirectory(Path.GetTempPath()); 

    setAttributesNormal(new DirectoryInfo(ssDir)); 
    Directory.Delete(ssDir, true); 
} 


[TestMethod] 
public void TestAddFile() 
{ 
    File.WriteAllText(dir + "a", "This is a file"); 
    ss.AddFile("a"); 
    ... 
} 

[TestMethod] 
public void TestAddFolder() 
{ 
    ss.CreateFolder("a/"); 
    ... 
} 

Questo fornisce un nuovo percorso temporaneo casuale per ciascun test e lo elimina quando viene eseguito. È possibile verificare questo eseguendolo in debug e guardando la variabile dir per ogni caso di test.

+3

Il metodo StartUp verrà richiamato solo prima dell'esecuzione del test da questa classe. Voglio eseguire il metodo prima di tutti i test di tutte le classi nell'assemblaggio – brzozow

+1

FTQ "È possibile eseguire un metodo specifico prima di ogni test?". Ho risposto a questo. Se quello che intendi è "un metodo eseguito una volta, prima di tutti i test", la tua risposta è qui: http://stackoverflow.com/questions/639326/mstest-executing-method-before-each-test/639339#639339 – FryGuy

+1

Grazie per la risposta. Ma voglio eseguire il metodo prima di ogni test in assembly, non prima di ogni in una classe specifica. Forse la mia domanda non era abbastanza chiara. – brzozow