除了 lukbl 的答案,您可以在整个程序集范围内执行相同的操作,因此如果您有多个测试类,您将在 vstest.console.exe 的运行时对测试进行全局管理(如果您正在调用它例如多次)。
应根据您使用 vstest.console(或 mstest)的方式小心谨慎。如果您在多个测试代理之间进行负载平衡,每个测试代理将运行它们自己的 vstest.console.exe,因此会有它们自己的程序集级值,因此会话管理将受到运行的测试组的限制同一个代理。假设这种方法可以让您管理使用命令运行的整个测试集:vstest.console.exe /filter:tests.dll
这意味着无论 session_failed 变量的范围(类范围或程序集范围)如何,如果您最终使用不同的 vstest.console.exe 调用从同一类运行不同的测试,您将失去变量值或控制权。
话虽如此,多类测试场景的简单方法:
[TestClass]
public static class TestSettings
{
public static bool SessionTestsFailed = false;
[AssemblyInitialize]
public static void runsBeforeAnyTest(TestContext t)
{
TestSettings.SessionTestsFailed = false;
}
}
[TestClass]
public class Tests1
{
public TestContext TestContext { get; set; }
[TestInitialize()]
public void MyTestInitialize()
{
if (TestSettings.SessionTestsFailed)
Assert.Fail("Session failed, test aborted");
}
[TestCleanup]
public void MyTestFinalize()
{
if (TestContext.CurrentTestOutcome != UnitTestOutcome.Passed)
TestSettings.SessionTestsFailed = true;
}
[TestMethod]
public void test11()
{
Console.WriteLine("test11 ran");
Assert.Fail("fail the test");
}
[TestMethod]
public void test12()
{
Console.WriteLine("test12 ran");
Assert.Fail("fail the test");
}
}
[TestClass]
public class Tests2
{
public TestContext TestContext { get; set; }
[TestInitialize()]
public void MyTestInitialize()
{
if (TestSettings.SessionTestsFailed)
Assert.Fail("Session failed, test aborted");
}
[TestCleanup]
public void MyTestFinalize()
{
if (TestContext.CurrentTestOutcome != UnitTestOutcome.Passed)
TestSettings.SessionTestsFailed = true;
}
[TestMethod]
public void test21()
{
Console.WriteLine("test21 ran");
Assert.Fail("fail the test");
}
[TestMethod]
public void test22()
{
Console.WriteLine("test22 ran");
Assert.Fail("fail the test");
}
这是一次更新所有测试初始化方法的简单方法,如果它们的签名相同,则使用正则表达式匹配,Visual Studio 全部替换:查找:
(\s*)public void MyTestInitialize\(\)(\s*)(\r*\n)(\s*){(\r*\n)
代替:
$1public void MyTestInitialize()$3$4{$1\tif (TestSettings.SessionTestsFailed) Assert.Fail("Session failed, test aborted");
和 TestFinalize() 类似。