2013-04-08 13 views
13

Wir betreiben nächtliche Builds, die am Ende alle unsere UnitTest mit dem MsTest-Framework laufen.Wie zu stoppen MsTest Tests Ausführung beim ersten Fehler?

Wir müssen 100% Erfolgsquote haben, wenn also einer fehlschlägt, hat es keinen Sinn, die anderen laufen zu lassen; Daher möchten wir die Ausführung beim ersten fehlgeschlagenen Test stoppen.

Können wir das irgendwie erreichen?

+0

ich habe, Das gleiche Problem. Jeder? – Zambonilli

Antwort

0

Sind Sie wirklich sicher, dass Sie Testergebnisse wegwerfen wollen?

Sagen Sie jemand hat einen schlechten Tag und führt mehrere Bugs A, B und C in Ihren Code ein. Am Montag erfährst du vielleicht nur etwas über A, also behebst du das, und du weißt bis Dienstag nichts über Ausgabe B, und dann reparierst du C erst am Mittwoch. Aber da Sie die Testabdeckung für eine halbe Woche verpasst haben, werden die am Montag eingeführten Fehler erst Tage nach ihrer Einführung entdeckt und sind teurer und benötigen mehr Zeit, um sie zu beheben.

Wenn es nicht viel kostet, die Tests nach einem Fehler weiter auszuführen, sind diese Informationen nicht hilfreich?


Das heißt, Hacking zusammen eine Lösung in Ihren Testbibliotheken wäre nicht so schwer. Werden alle möglichen codepaths von Testfehlern eine statische Variable StopAssert.Failed = true; (wahrscheinlich eingestellt durch Anrufe Assert und fangen AssertFailedExceptions wickeln. Dann fügen Sie einfach [TestInitialize()] Methoden zu jeder Testklasse jeden Test nach einem Ausfall zu stoppen!

public class StopAssert 
{ 
    public static bool Failed { get; private set; } 

    public static void AreEqual<T>(T expected, T actual) 
    { 
     try 
     { 
      Assert.AreEqual(expected, actual); 
     } 
     catch 
     { 
      Failed = true; 
      throw; 
     } 
    } 

    // ...skipping lots of methods. I don't think inheritance can make this easy, but reflection might? 

    public static void IsFalse(bool condition) 
    { 
     try 
     { 
      Assert.IsFalse(condition); 
     } 
     catch 
     { 
      Failed = true; 
      throw; 
     } 
    } 
} 


[TestClass] 
public class UnitTest1 
{ 
    [TestInitialize()] 
    public void Initialize() 
    { 
     StopAssert.IsFalse(StopAssert.Failed); 
    } 

    [TestMethod] 
    public void TestMethodPasses() 
    { 
     StopAssert.AreEqual(2, 1 + 1); 
    } 

    [TestMethod] 
    public void TestMethodFails() 
    { 
     StopAssert.AreEqual(0, 1 + 1); 
    } 

    [TestMethod] 
    public void TestMethodPasses2() 
    { 
     StopAssert.AreEqual(2, 1 + 1); 
    } 
} 

[TestClass] 
public class UnitTest2 
{ 
    [TestInitialize()] 
    public void Initialize() 
    { 
     StopAssert.IsFalse(StopAssert.Failed); 
    } 

    [TestMethod] 
    public void TestMethodPasses() 
    { 
     StopAssert.AreEqual(2, 1 + 1); 
    } 

    [TestMethod] 
    public void TestMethodFails() 
    { 
     StopAssert.AreEqual(0, 1 + 1); 
    } 

    [TestMethod] 
    public void TestMethodPasses2() 
    { 
     StopAssert.AreEqual(2, 1 + 1); 
    } 
} 
+0

Jeder hat eine Möglichkeit, dies mit Konfigurationseinstellungen zu tun? Wir haben eine Menge Code, der geändert werden müsste :( – Steve

Verwandte Themen