Unit testing 如何在*n*测试失败后停止MsTest测试执行

Unit testing 如何在*n*测试失败后停止MsTest测试执行,unit-testing,powershell,mstest,Unit Testing,Powershell,Mstest,我希望通过MS Test(从windows控制台)运行单元测试,以便在失败的测试计数超过某个阈值时停止/终止测试执行 对于我的用例来说,当某些百分比的测试已经失败时,继续运行测试是没有意义的 我只能考虑创建一个新的控制台应用程序来包装mstest.exe的执行,以便实时解析标准输出, 并最终终止进程,例如: var pi = new ProcessStartInfo() { FileName = MS_TEST, UseShellExecute = false, Redi

我希望通过MS Test(从windows控制台)运行单元测试,以便在失败的测试计数超过某个阈值时停止/终止测试执行

对于我的用例来说,当某些百分比的测试已经失败时,继续运行测试是没有意义的

我只能考虑创建一个新的控制台应用程序来包装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重定向并非微不足道

更新
请注意,我无法修改测试代码,我需要在不以任何方式修改测试代码的情况下完成此操作。

创建一个
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
类中定义的测试完成运行后进行评估。在这种方法中,我们评估刚刚完成的测试的输出。如果失败,我们将终止负责运行测试的进程

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();
        }
    }
}
在下面的示例中,我们定义了三个测试。第二个测试,
test\u substrating\u 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);
        }
    }
}

谢谢你的回答,但我无法修改测试代码:(谢谢你的回答。它解决了我使用黑盒项进行测试的一个大问题,这个黑盒项有一个处理问题。我在测试类中添加了一个distructor,在计算和更新测试结果后,我在那里终止了进程。