如何在* n *失败测试后停止MsTest测试执行
问题描述:
我想通过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似乎是一个选项,但标准输出重定向不是微不足道的。
更新
作为一个说明,我不能修改测试代码,我需要这是不以任何方式修改测试的代码来完成。
答
创建一个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);
}
}
}
感谢这个答案,但我不能修改测试代码:( – thepirat000
感谢您的答案。它解决了我一个巨大的问题与测试。 我在测试类中添加了一个分析器,在测试结果被计算和更新后,我杀死了这个过程。 – Seffix