2017-02-10 5 views
1

Я хочу запускать модульные тесты через MS Test (из консоли Windows) таким образом, чтобы я мог остановить/убить выполнение теста всякий раз, когда не прошел тесты, счет превышает определенные пороговое значение.Как остановить выполнение тестов MsTest после * n * неудачных тестов

Для моего случая использования нет смысла продолжать выполнение тестов, когда определенный процент тестов уже не выполнен.

я могу думать только в создании нового консольного приложения, чтобы обернуть выполнение MSTest.exe, так что я могу разобрать стандартный вывод в реальном времени, и в конечном итоге убить процесс, например:

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; 
     } 
    } 
} 

Может ли кто-нибудь предложить лучший способ для этого? Я не думаю, что это поддерживается MsTest.

PowerShell представляется вариантом, но перенаправление stdout не является тривиальным.

Update

Как примечание, я не могу изменить тестовый код, мне нужно, чтобы это было сделано без изменения кода тестов в любом случае.

ответ

2

Создайте BaseTestClass, который содержит метод, ответственный за убийство процесса, который запускает тесты.

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(); 
     } 
    } 
} 

Вы должны наследовать все ваши тестовые классы от BaseTestClass и использовать атрибут [TestCleanup]. Метод TestCleanup() оценивается при завершении теста, определенного в классе DemoTests. В этом методе мы оцениваем результат теста, который только что закончил. Если это не удается, мы убьем процесс, ответственный за выполнение тестов.

В следующем примере мы определили три теста. Второй тест, Test_Substracting_Operation(), предназначен для непреднамеренного отказа, поэтому третий тест никогда не будет запущен.

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

Спасибо за этот ответ, но я не могу изменить код тесты :( – thepirat000

+0

Спасибо за этот ответ. Он решил меня огромная проблема с тестированием с использованием элемента черного ящика, который имеет УТИЛИЗАЦИИ вопрос. Я добавил класс-конструктор к тестовому классу, там я убил процесс, после того как результаты тестов были рассчитаны и обновлены. – Seffix

Смежные вопросы