2016-04-06 3 views
3

Ich habe eine Batch-Datei, die mehrere Tests enthält, die in einer ähnlichen Form unten definiert sind.Wie kann der Test gestoppt werden, wenn ein Test fehlschlägt, indem vstest.console.exe verwendet wird?

vstest.console.exe Test.dll /Settings:"test.runsettings" /Tests:"t1,t2,t3,t4,t5" 

Die Tests werden in der Reihenfolge von T1 bis T5 ausgeführt. Ich möchte jedoch vstest stoppen, wenn einer der Tests fehlschlägt. Ist dies mit vstest.console.exe möglich?

Btw, der Inhalt meiner test.runsettings ist

<?xml version="1.0" encoding="utf-8"?> 
<RunSettings> 
    <MSTest> 
    <ForcedLegacyMode>true</ForcedLegacyMode> 
     <KeepExecutorAliveAfterLegacyRun>true</KeepExecutorAliveAfterLegacyRun> 
    </MSTest> 
</RunSettings> 

ich die Documentation for runsettings geprüft haben, es scheint, gibt es kein Flag/Attribut für diesen Fall.

+1

Ich fragte darüber auf msdn für TFS-Build-Server. No Go. Ich weiß nicht über vstest, tho. – Will

+1

Sie haben mich an MSDN erinnert. Ich habe die gleiche Frage auf msdn gepostet, hoffentlich werden sie Antworten haben, dann kann ich hier posten, was auch immer die offizielle Meinung über die Angelegenheit ist.Ich denke, dass eine Flagge, die dies implementiert, verfügbar sein sollte. Aber es ist nirgends in der Dokumentation. – Bangonkali

+0

Ich kann nicht glauben, dass das nicht möglich ist – thepirat000

Antwort

1

Wenn es eine Option für Sie ist, dann könnte man Basisklasse für Tests mit Bereinigung einzuführen, initialisieren Methoden und TestContext Eigenschaft.

In der Bereinigungsmethode überprüfen Sie, ob der Test fehlgeschlagen ist, und indem Sie Assert.Fail in TestInitialize auslösen, lassen Sie danach keinen anderen Test mehr durch.

[TestClass] 
public class BaseTest 
{ 
    private static bool _failAllTests; 
    public TestContext TestContext { get; set; } 

    [TestInitialize] 
    public void InitializeMethod() 
    { 
     if (_failAllTests) 
     { 
      Assert.Fail("Fail all tests"); 
     } 
    } 

    [TestCleanup] 
    public void CleanUpMethod() 
    { 
     if (TestContext.CurrentTestOutcome == UnitTestOutcome.Failed) 
     { 
      _failAllTests = true; 
     } 
    } 
} 
[TestClass] 
public class UnitTest1 : BaseTest 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     Assert.Fail("TestMethod1 failed!"); 
    } 
    [TestMethod] 
    public void TestMethod2() 
    { 
     Assert.IsTrue(true, "TestMethod2 passed!"); 
    } 
} 
2

Wenn die Anzahl der auszuführenden Tests gering ist, wie in Ihrem Beispiel, können Sie sie in mehrere Durchläufe von vstest.console.exe aufteilen und ERRORLEVEL im Stapel überprüfen. Wenn ERRORLEVEL nicht 0 ist, bedeutet dies, dass ein Test fehlschlägt. Sie können den Stapel beenden.

vstest.console.exe Test.dll /Settings:"test.runsettings" /Tests:"t1" 
IF ERRORLEVEL 1 GOTO exit 
vstest.console.exe Test.dll /Settings:"test.runsettings" /Tests:"t2" 
IF ERRORLEVEL 1 GOTO exit 
... 

:exit 
+0

Dies ist ein großartiger Vorschlag! Ich werde @lukbl Vorschlag versuchen, wenn es funktioniert, dann werde ich dieses versuchen. Ich plane beide zu implementieren, um zu sehen, was schneller ist. Auch die Implementierung der ErrorLevel pro DLL oder Testsuite wäre eine gute Idee. – Bangonkali

0

Neben lukbl Antwort, können Sie die gleiche Montageweit tun, so werden Sie ein globales Management auf den Tests, wenn Sie mehrere Testklassen haben, während vstest.console.exe-Zeit liefen gelassen (wenn Sie es zum Beispiel mehrere Male anrufen).

Vorsicht ist geboten, je nachdem, wie Sie vstest.console (oder mstest) einsetzen. Wenn Sie einen Lastenausgleich zwischen mehreren Testagenten durchführen, führt jeder Testagent seine eigene vstest.console.exe aus und verfügt daher über eigene Werte auf Assemblyebene. Daher wird die Sitzungsverwaltung durch die Gruppe der Tests eingeschränkt, die ausgeführt werden derselbe Agent. Nehmen wir an, dieser Ansatz gibt Ihnen die Verwaltung aller Tests, die Sie mit einem Befehl ausführen: vstest.console.exe/filter: tests.dll

Das bedeutet unabhängig vom Umfang Ihrer session_failed -Variable (klassenweit oder assembly-wide) Wenn Sie verschiedene Tests der gleichen Klasse mit verschiedenen vstest.console.exe-Aufrufen ausführen, verlieren Sie den Variablenwert oder das Steuerelement.

aber sagte, dass ein einfacher Ansatz für Multi-Class-Testszenario:

[TestClass] 
public static class TestSettings 
{ 
    public static bool SessionTestsFailed = false; 

    [AssemblyInitialize] 
    public static void runsBeforeAnyTest(TestContext t) 
    { 
     TestSettings.SessionTestsFailed = false; 
    } 
} 

[TestClass] 
public class Tests1 
{ 
    public TestContext TestContext { get; set; } 

    [TestInitialize()] 
    public void MyTestInitialize() 
    { 
     if (TestSettings.SessionTestsFailed) 
      Assert.Fail("Session failed, test aborted"); 
    } 

    [TestCleanup] 
    public void MyTestFinalize() 
    { 
     if (TestContext.CurrentTestOutcome != UnitTestOutcome.Passed) 
      TestSettings.SessionTestsFailed = true; 
    } 

    [TestMethod] 
    public void test11() 
    { 
     Console.WriteLine("test11 ran"); 
     Assert.Fail("fail the test"); 
    } 

    [TestMethod] 
    public void test12() 
    { 
     Console.WriteLine("test12 ran"); 
     Assert.Fail("fail the test"); 
    } 
} 

[TestClass] 
public class Tests2 
{ 
    public TestContext TestContext { get; set; } 

    [TestInitialize()] 
    public void MyTestInitialize() 
    { 
     if (TestSettings.SessionTestsFailed) 
      Assert.Fail("Session failed, test aborted"); 
    } 

    [TestCleanup] 
    public void MyTestFinalize() 
    { 
     if (TestContext.CurrentTestOutcome != UnitTestOutcome.Passed) 
      TestSettings.SessionTestsFailed = true; 
    } 

    [TestMethod] 
    public void test21() 
    { 
     Console.WriteLine("test21 ran"); 
     Assert.Fail("fail the test"); 
    } 

    [TestMethod] 
    public void test22() 
    { 
     Console.WriteLine("test22 ran"); 
     Assert.Fail("fail the test"); 
    } 

Und hier ist eine einfache Möglichkeit, alle Ihre Tests auf einmal initialisieren Methoden zu aktualisieren, wenn ihre Unterschrift das gleiche ist, regexp Matching Fund:

(\s*)public void MyTestInitialize\(\)(\s*)(\r*\n)(\s*){(\r*\n) 

ersetzen:

$1public void MyTestInitialize()$3$4{$1\tif (TestSettings.SessionTestsFailed) Assert.Fail("Session failed, test aborted"); 
, Visual Studio alle ersetzen

und ähnlich für TestFinalize().

Verwandte Themen