2017-02-10 3 views
1

Ich möchte Komponententests über MS Test (von Windows-Konsole) auf eine Weise ausführen, dass ich die Testausführung stoppen/beenden kann, wenn die fehlgeschlagenen Tests bestimmten übersteigt Schwellwert.Wie MsTest Tests nach * n * fehlgeschlagen Tests zu stoppen

Für meinen Anwendungsfall gibt es keinen Punkt Tests laufen zu halten, wenn bestimmter Prozentsatz der bereits nicht bestandenen Tests.

ich eine neue Konsole bei der Erstellung App nur denken kann, die MSTest.exe Ausführung wickeln, so kann ich die Standardausgabe in Echtzeit, und schließlich töten den Prozess, zum Beispiel analysieren:

var pi = new ProcessStartInfo() 
{ 
    FileName = MS_TEST, 
    UseShellExecute = false, 
    RedirectStandardOutput = true, 
    Arguments = MS_TEST_ARGS 
}; 
int passed = 0; int failed = 0; 
using (var process = Process.Start(pi)) 
{ 
    while (!process.StandardOutput.EndOfStream) 
    { 
     string line = process.StandardOutput.ReadLine(); 
     if (line.Contains("Passed")) 
      passed++; 
     if (line.Contains("Failed")) 
      failed++; 
     if (failed >= THRESHOLD) 
     { 
      process.Kill(); 
      break; 
     } 
    } 
} 

Kann jemand einen besseren Weg vorschlagen, dies zu tun? Ich denke nicht, dass dies von MsTest nativ unterstützt wird.

Powershell scheint eine Option zu sein, aber die stdout Umleitung ist nicht trivial.

aktualisieren

Als Hinweis, ich den Test-Code nicht ändern kann, muss ich dies in irgendeiner Weise ohne Änderung der Tests Code durchgeführt werden.

Antwort

2

ein BaseTestClass erstellen, die ein Verfahren für das Töten des Prozesses verantwortlich enthält, die die Tests ausführt.

using System.Diagnostics; 

namespace UnitTestProject1 
{ 
    public class BaseTestClass 
    { 
     private readonly int _threshold = 1; 
     private static int _failedTests; 

     protected void IncrementFailedTests() 
     { 
      if (++_failedTests >= _threshold) 
       Process.GetCurrentProcess().Kill(); 
     } 
    } 
} 

Ihr müssen alle Testklassen von BaseTestClass erben und die [TestCleanup] Attribut verwenden. Die TestCleanup() Methode ausgewertet wird, wenn ein Test in der DemoTests Klasse definiert beendet ausgeführt wird. Ist in dieser Methode, wo wir die Ausgabe des Tests, der gerade beendet wurde, auswerten. Wenn es fehlschlägt, beenden wir den Prozess, der für das Ausführen der Tests verantwortlich ist.

Im folgenden Beispiel haben wir drei Tests definiert haben. Der zweite Test, Test_Substracting_Operation(), soll absichtlich fehlschlagen, so dass der dritte Test niemals ausgeführt wird.

using Microsoft.VisualStudio.TestTools.UnitTesting; 

namespace UnitTestProject1 
{ 
    [TestClass] 
    public class DemoTests : BaseTestClass 
    { 
     public TestContext TestContext { get; set; } 

     [TestCleanup] 
     public void TestCleanup() 
     { 
      if (TestContext.CurrentTestOutcome == UnitTestOutcome.Failed) 
      { 
       IncrementFailedTests(); 
      } 
     } 
     [TestMethod] 
     public void Test_Adding_Operation() 
     { 
      // Arrange 
      int x = 1; 
      int y = 2; 

      // Act 
      int result = x + y; 

      // Assert 
      Assert.AreEqual(3, result); 
     } 

     [TestMethod] 
     public void Test_Substracting_Operation() 
     { 
      // Arrange 
      int x = 1; 
      int y = 2; 

      // Act 
      int result = x - y; 

      // Assert 
      Assert.AreEqual(100, result); 
     } 

     [TestMethod] 
     public void Test_Multiplication_Operation() 
     { 
      // Arrange 
      int x = 1; 
      int y = 2; 

      // Act 
      int result = x * y; 

      // Assert 
      Assert.AreEqual(2, result); 
     } 
    } 
} 
+0

Dank für diese Antwort, aber ich bin nicht in der Lage, die Tests Code :( – thepirat000

+0

Vielen Dank für die Antwort zu ändern. Es löste mir ein riesiges Problem mit dem Testen eines Black-Box-Element verwendet, die ein Entsorgung Problem hat. ich habe eine distructor auf die Testklasse, da ich den Prozess getötet, nachdem die Testergebnisse berechnet wurde und aktualisiert. – Seffix

Verwandte Themen