2009-03-12 4 views
25

Ist es möglich, bestimmte Methoden vor jedem Test in einer Baugruppe auszuführen?MsTest - Ausführungsmethode vor jedem Test in einer Baugruppe

Ich weiß über TestInitialize Attribut, aber dieses Attribut hat "Class Scope". Wenn es in einer Testklasse definiert ist, wird es vor jedem Test dieser Klasse ausgeführt.

Ich möchte eine Methode definieren, die vor jedem in einer ganzen Baugruppe definierten Test ausgeführt wird.

Antwort

11

Ich bin nicht sicher, dass diese Funktion in MsTest out-of-Box wie in anderen Test-Frameworks (z. B. MbUnit) möglich ist.

Wenn ich MsTest verwenden muss, dann löse ich dies, indem ich die abstrakte Klasse TestBase mit dem Attribut [TestInitialize] definiere und jeder Test, der dieses Verhalten benötigt, stammt von dieser Basisklasse. In Ihrem Fall muss jede Testklasse in Ihrer Baugruppe von dieser Basis erben ...

Und es gibt wahrscheinlich eine andere Lösung, Sie können Ihr benutzerdefiniertes Testattribut erstellen - aber ich habe das noch nicht ausprobiert ... :)

0

Ich denke, Sie suchen nach dem ClassInitialize Attribut.

+2

ClassInitialize für alle Klassen einmal ausgeführt wird. Wenn wir also 5 Tests in der Klasse haben, wird die Methode mit ClassInitialize einmal ausgeführt. – brzozow

+2

Ja, wahrscheinlich hat er TestInitialize gemeint. –

1

Nun ist nicht MSTest die Klasse für jeden Test instanziieren? Das war mein Verständnis davon. In einem solchen Fall ist der Initialisierungscode (pro Test per Definition) alles, was Sie von Ihrem Konstruktor aufrufen.

EDIT: Wenn es nicht funktioniert (was ich immer noch denke, es sollte, weil MSTest sicherstellen muss, dass einzelne Testmethode ausgeführt wird, isoliert) dann TestInitialize ist Ihr Attribut. Übrigens ist der beste Komponententest-Vergleich verfügbar unter Link on Codeplex

+0

Ich möchte Code schreiben, der vor allen Tests in allen Testklassen ausgeführt wird. Ihre Lösung funktioniert also nur mit einer Testklasse – brzozow

+0

Nein, das stimmt nicht. Wenn es wahr ist, dass MSTest-Kabelbaum neue Testklasseninstanzen pro Test instanziiert (was meiner Meinung nach für die Testisolierungszwecke gilt), wird der Code im Konstruktor vor jeder Testmethode ausgeführt. –

+0

Es ist wahr, was Sie schreiben, aber es löst nicht mein Problem. Ich möchte einige statische Eigenschaften vor jedem Test zurücksetzen (ich weiß, es ist schlechtes Design). Ich habe 400 Klassen mit Unit Tests. Ich möchte diesen Code nicht in allen Klassen schreiben. – brzozow

52

[TestInitialize()] ist was Sie brauchen.

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/"); 
    ... 
} 

Dies gibt einen neuen zufälligen temporären Pfad für jeden Test und löscht es, wenn es fertig ist. Sie können dies überprüfen, indem Sie es im Debug ausführen und die dir -Variable für jeden Testfall betrachten.

+3

StartUp-Methode wird nur aufgerufen, bevor Test von dieser einen Klasse ausgeführt wird. Ich möchte Methode ausführen, bevor alle Tests aus allen Klassen in Assembly – brzozow

+1

FTQ "Ist es möglich, bestimmte Methode vor jedem Test auszuführen?". Ich habe das geantwortet. Wenn Sie meinen, dass "eine Methode einmal vor allen Tests ausgeführt wird", dann ist Ihre Antwort hier: http://stackoverflow.com/questions/639326/msstest-executing-method-before-each-test/639339#639339 – FryGuy

+1

Danke für die Antwort. Aber ich möchte Methode vor jedem Test in der Versammlung ausführen - nicht vor jeder in einer bestimmten Klasse. Vielleicht war meine Frage nicht klar genug. – brzozow

Verwandte Themen