如果使用 vstest.console.exe 一项测试失败,如何停止测试?
How to stop test if one test fails using vstest.console.exe?
我有一个批处理文件,其中包含以下面类似形式定义的多个测试。
vstest.console.exe Test.dll /Settings:"test.runsettings" /Tests:"t1,t2,t3,t4,t5"
测试 运行 按顺序从 t1 到 t5。但是,如果任何一项测试失败,我想停止 vstest。这可能使用 vstest.console.exe?
顺便说一下,我的 test.runsettings 的内容是
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<MSTest>
<ForcedLegacyMode>true</ForcedLegacyMode>
<KeepExecutorAliveAfterLegacyRun>true</KeepExecutorAliveAfterLegacyRun>
</MSTest>
</RunSettings>
我查了Documentation for runsettings,好像没有flag/attribute这种情况。
如果 运行 的测试数量很少,就像在您的示例中,您可以将其拆分为 vstest.console.exe 的多个 运行 并在批处理中检查 ERRORLEVEL。如果你的ERRORLEVEL不为0,说明测试失败,可以退出批处理。
vstest.console.exe Test.dll /Settings:"test.runsettings" /Tests:"t1"
IF ERRORLEVEL 1 GOTO exit
vstest.console.exe Test.dll /Settings:"test.runsettings" /Tests:"t2"
IF ERRORLEVEL 1 GOTO exit
...
:exit
如果它适合您,那么您可以引入基础 class 用于带有清理、初始化方法和 TestContext
属性 的测试。
在清理方法中,您将检查测试是否失败,并通过在 TestInitialize
中触发 Assert.Fail
,之后不允许任何其他测试通过。
[TestClass]
public class BaseTest
{
private static bool _failAllTests;
public TestContext TestContext { get; set; }
[TestInitialize]
public void InitializeMethod()
{
if (_failAllTests)
{
Assert.Fail("Fail all tests");
}
}
[TestCleanup]
public void CleanUpMethod()
{
if (TestContext.CurrentTestOutcome == UnitTestOutcome.Failed)
{
_failAllTests = true;
}
}
}
[TestClass]
public class UnitTest1 : BaseTest
{
[TestMethod]
public void TestMethod1()
{
Assert.Fail("TestMethod1 failed!");
}
[TestMethod]
public void TestMethod2()
{
Assert.IsTrue(true, "TestMethod2 passed!");
}
}
除了 lukbl 的回答之外,您还可以执行相同的操作 assembly-wide,因此如果您有多个测试 class,您将在 [=34] 期间对测试进行全局管理=] 的 run-time(例如,如果您多次调用它)。
应根据您使用 vstest.console(或 mstest)的方式谨慎行事。如果您 load-balancing 在多个测试代理之间,每个测试代理将 运行 自己的 vstest.console.exe,因此会有自己的 assembly-level 值,因此会话管理将是受同一代理上 运行ning 测试组的限制。比方说,这种方法可以让您通过命令 运行 管理整套测试:
vstest.console.exe /过滤器:tests.dll
这意味着无论您的 session_failed 变量(class-wide 或 assembly-wide)的范围如何,如果您最终 运行 从同一个 class 进行不同的测试] 使用不同的 vstest.console.exe 调用,您将丢失变量值或控件。
也就是说,multi-class 测试场景的简单方法:
[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)
替换:
public void MyTestInitialize(){\tif (TestSettings.SessionTestsFailed) Assert.Fail("Session failed, test aborted");
与 TestFinalize() 类似。
我有一个批处理文件,其中包含以下面类似形式定义的多个测试。
vstest.console.exe Test.dll /Settings:"test.runsettings" /Tests:"t1,t2,t3,t4,t5"
测试 运行 按顺序从 t1 到 t5。但是,如果任何一项测试失败,我想停止 vstest。这可能使用 vstest.console.exe?
顺便说一下,我的 test.runsettings 的内容是
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<MSTest>
<ForcedLegacyMode>true</ForcedLegacyMode>
<KeepExecutorAliveAfterLegacyRun>true</KeepExecutorAliveAfterLegacyRun>
</MSTest>
</RunSettings>
我查了Documentation for runsettings,好像没有flag/attribute这种情况。
如果 运行 的测试数量很少,就像在您的示例中,您可以将其拆分为 vstest.console.exe 的多个 运行 并在批处理中检查 ERRORLEVEL。如果你的ERRORLEVEL不为0,说明测试失败,可以退出批处理。
vstest.console.exe Test.dll /Settings:"test.runsettings" /Tests:"t1"
IF ERRORLEVEL 1 GOTO exit
vstest.console.exe Test.dll /Settings:"test.runsettings" /Tests:"t2"
IF ERRORLEVEL 1 GOTO exit
...
:exit
如果它适合您,那么您可以引入基础 class 用于带有清理、初始化方法和 TestContext
属性 的测试。
在清理方法中,您将检查测试是否失败,并通过在 TestInitialize
中触发 Assert.Fail
,之后不允许任何其他测试通过。
[TestClass]
public class BaseTest
{
private static bool _failAllTests;
public TestContext TestContext { get; set; }
[TestInitialize]
public void InitializeMethod()
{
if (_failAllTests)
{
Assert.Fail("Fail all tests");
}
}
[TestCleanup]
public void CleanUpMethod()
{
if (TestContext.CurrentTestOutcome == UnitTestOutcome.Failed)
{
_failAllTests = true;
}
}
}
[TestClass]
public class UnitTest1 : BaseTest
{
[TestMethod]
public void TestMethod1()
{
Assert.Fail("TestMethod1 failed!");
}
[TestMethod]
public void TestMethod2()
{
Assert.IsTrue(true, "TestMethod2 passed!");
}
}
除了 lukbl 的回答之外,您还可以执行相同的操作 assembly-wide,因此如果您有多个测试 class,您将在 [=34] 期间对测试进行全局管理=] 的 run-time(例如,如果您多次调用它)。
应根据您使用 vstest.console(或 mstest)的方式谨慎行事。如果您 load-balancing 在多个测试代理之间,每个测试代理将 运行 自己的 vstest.console.exe,因此会有自己的 assembly-level 值,因此会话管理将是受同一代理上 运行ning 测试组的限制。比方说,这种方法可以让您通过命令 运行 管理整套测试: vstest.console.exe /过滤器:tests.dll
这意味着无论您的 session_failed 变量(class-wide 或 assembly-wide)的范围如何,如果您最终 运行 从同一个 class 进行不同的测试] 使用不同的 vstest.console.exe 调用,您将丢失变量值或控件。
也就是说,multi-class 测试场景的简单方法:
[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)
替换:
public void MyTestInitialize(){\tif (TestSettings.SessionTestsFailed) Assert.Fail("Session failed, test aborted");
与 TestFinalize() 类似。