2009-10-09 6 views
28

Ich arbeite in einer Anwendung, die meist Single-Thread, Single-User ist. Es gibt ein paar Worker-Threads hier und dort, und sie verwenden nur Thread-sichere Objekte und Klassen. Die Komponententests testen tatsächlich diejenigen mit mehreren Threads (explizit für die Tests erstellt), und sie testen gut.Gibt es eine Möglichkeit, Komponententests sequenziell mit MSTests auszuführen?

Die Tests der VSTS-Einheit schlagen fehl, wenn Geschäftsobjekte und Subsysteme getestet werden, die nicht Thread-sicher sind. Es ist in Ordnung, wenn sie nicht threadsicher sind, so nutzt die Anwendung sie.

Aber der 'one thread per TestMethod'-Ansatz von MS-Tests tötet uns. Ich musste Objektsperren in vielen Komponententestklassen implementieren, um sicherzustellen, dass die Tests nacheinander ausgeführt werden (ich kümmere mich nicht wirklich um die Reihenfolge, aber ich kann nicht zwei Testmethoden haben, die dasselbe Objekt treffen die selbe Zeit).

Der Code sieht wie folgt aus:

[TestClass] 
public class TestSomeObject 
{ 
    static object turnStile = new object(); 
... 
    [TestMethod] 
    public void T01_TestThis() 
    { 
     lock(turnStile) 
     { 
     .. actual test code 
     } 
    } 

    [TestMethod] 
    public void T02_TestThat() 
    { 
     lock(turnStile) 
     { 
     -- actual test code 
     } 
    } 

} 

Gibt es eine bessere/elegantere Art und Weise den Testlauf der Reihe nach zu machen?

+0

angeben, so scheint es, dass Sie eine Instanz eines Objekts in allen Ihren Tests wiederverwenden? – BlackTigerX

+0

Ja, im Wesentlichen. Manchmal ist es die Datenbank, manchmal ist es ein Singleton - wie in der Anwendung –

+1

verwendet, da Sie behaupten, dies sei * Unit-Testing * von Ihrem Tag, sollten Sie Ihre Abhängigkeiten mock/stub out, besonders Abhängigkeiten, die nicht Thread-sicher – mxmissile

Antwort

16

Es gibt die Idee eines "geordneten Tests", in dem Sie Tests nacheinander auflisten können. Es ist mehr darauf ausgerichtet, eine bestimmte Reihenfolge zu gewährleisten, aber ich kann nicht sehen, wie das möglich wäre, wenn B nicht auf die Beendigung von A wartet.

Abgesehen davon ist es bedauerlich, dass Ihre Tests sich gegenseitig stören. Es gibt Setup/TearDown-Methoden, die pro Test verwendet werden können, so dass es schließlich möglich ist, die Tests voneinander zu isolieren.

+0

Es ist bedauerlich, dass MSTest alle Tests in derselben App-Domäne ausführt, sodass Tests sich gegenseitig stören können. – Triynko

23

Verwenden Sie eine Ordered Test.

Test> Neuer Test> Bestellte-Test

Test > New Test

Ordered Test

+0

Tolles Zeug. Ich wusste, dass es einen einfacheren Weg geben musste ... :) –

+0

Wie spezifiziert man eine .runsettings Datei, wenn man einen geordneten Test benutzt? Insbesondere muss ich auf den TestContext mit Parametern zugreifen, die in den .runsettings angegeben sind. –

+0

@ajhuddy: Klingt wie ein guter Kandidat für eine neue Stack Overflow Frage. Suchen Sie zuerst, um sicherzustellen, dass Ihre Frage nicht bereits gestellt und beantwortet wurde, und beziehen Sie sich beim Schreiben Ihrer neuen Frage auf diese Frage. –

8

habe ich endlich die Testmethode bestellt. Es läuft gut.

Allerdings hatte ich eine verdammt gute Zeit damit es mit dem NAnt Build funktioniert. Ausführen nur Die geordnete Testliste im Build erfordert die Verwendung der Schalter/testmetadata und/testlist im MSTest-Aufrufblock. Die Dokumentation zu diesen ist skizzenhaft, um eine Art Beschreibung zu verwenden. Ich google überall für Beispiele von "MSTest/testmetadata/testlist" ohne Wirkung.

Der Trick ist jedoch einfach, und ich fühle mich gezwungen, es an die Gemeinschaft zurückzugeben, falls jemand anderes in das gleiche Problem stößt.

  1. Bearbeiten der Test-Metadatendatei (mit einer .vsmdi Erweiterung), hinzufügen und eine neue Liste in der Liste der Tests (den ersten Knoten in dem Baum auf dem linken Bereich. Die Namen, den Sie geben möchten, Beispiel: 'SequentialTests'
  2. Wenn Sie den Schalter/testcontainer für den MSTest-Aufruf verwendet haben, entfernen Sie ihn.
  3. hinzufügen Schalter für MSTest ->/testmetadata:
  4. einen Schalter hinzu MSTest /Testliste: SequentialTests (oder einen beliebigen Namen Sie verwendet)

Dann MSTest läuft nur die im Test aufgeführten Prüfungen Liste, die Sie erstellt haben.

Wenn jemand eine bessere Methode hat, würde ich gerne davon hören!

12

Sie können für jede Testausführung speziell einen Mutex anfordern, entweder in den spezifischen Tests, die Sie serialisieren möchten, oder für alle Tests in einer Klasse (unabhängig davon, welche Mutex-Zeichenfolge dieselbe ist).

sollte
private readonly Mutex testMutex = new Mutex(true, "MySpecificTestScenarioUniqueMutexString"); 

[TestInitialize] 
public void Initialize() 
{ 
    testMutex.WaitOne(TimeSpan.FromSeconds(1)); 
} 

[TestCleanup] 
public void Cleanup() { 
    testMutex.ReleaseMutex(); 
} 

Um klar zu sein das ist kein Merkmal von Tests, ANY Verriegelungsstruktur arbeiten:

Für eine ganze Testklasse, können Sie die TestInitialize und TestCleanup Attribute wie so verwenden können. Ich bin mit dem System zur Verfügung gestellt Mutexes in diesem Fall: https://msdn.microsoft.com/en-us/library/system.threading.mutex(v=vs.110).aspx

+0

Hallo, könnten Sie das näher ausführen? Zum Beispiel brauche ich eine Erklärung zu diesem "... was auch immer die gleiche Mutex-Saite hat". Außerdem deklarieren Sie testMutex Private ReadOnly, aber in Initialisieren und Bereinigen verwenden Sie FileTestMutex ... thx – CTZStef

+0

Hallo! Die Referenzabweichung war ein Tippfehler, ich habe es behoben. Ich fügte auch einen Link zur Mutex-Klasse zur Verdeutlichung hinzu. Mutex ist eine von Microsoft bereitgestellte Sperrstruktur, die eine systemweite Zeichenfolge zum Sperren verwendet. Sie möchten also, dass die Zeichenfolge für jede Menge von Dingen, die Sie serialisieren möchten, eindeutig ist. Dies kann pro Test oder für den gesamten Test geschehen Klassen. Wenn Sie die Zeichenfolge überall kopieren/einfügen, wird jede Verwendung serialisiert. Beachten Sie auch die oben genannten 'OrderedTest' Vorschläge, die wahrscheinlich eine bessere Idee ist, wenn es für Sie funktioniert. Der Mutex-Ansatz (oder ein anderer manueller Verschluss) ist kompliziert. –

2

Ich benutzte Tests angeordnet, so dass sie auch den Befehl jenkins verwenden nur leicht konfiguriert

MSTest /testcontainer:"orderedtestfilename.orderedtest "/ Ergebnisdatei:" Testergebnisse .trx“

16

Sie Play

Rechtsklick auf die Testmethode verwenden -> zur Wiedergabeliste hinzufügen -> Neue Wiedergabeliste

Sie können dann die Ausführungsreihenfolge enter image description here

+0

Ich denke, das ist die beste Antwort auf die Frage. – user969153

+1

Arbeitete am besten, und war leicht genug, um unter einer Minute einzurichten. – Ruan

Verwandte Themen