2017-02-10 169 views
1

我想通过MS Test(从Windows控制台)运行单元测试,只要失败的测试计数超过某个值,我就可以停止/终止测试执行阈值。如何在* n *失败测试后停止MsTest测试执行

对于我的用例,当某些百分比的测试失败时,没有必要继续运行测试。

我只能认为在创造一个新的控制台应用程序来包装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似乎是一个选项,但标准输出重定向不是微不足道的。

更新

作为一个说明,我不能修改测试代码,我需要这是不以任何方式修改测试的代码来完成。

回答

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]属性。在DemoTests类中定义的测试已完成运行时,将评估TestCleanup()方法。在这种方法中,我们评估刚刚完成的测试的输出。如果失败了,我们杀死负责运行测试的进程。

在下面的例子中,我们定义了三个测试。第二个测试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

相关问题