如果一个测试使用vstest.console.exe失败,如何停止测试?

时间:2016-04-06 11:33:29

标签: c# vstest

我有一个批处理文件,其中包含以下类似形式定义的多个测试。

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,似乎没有这种情况的标志/属性。

2 个答案:

答案 0 :(得分:2)

如果要运行的测试数量很小(如您的示例),则可以将其拆分为多次运行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

答案 1 :(得分:0)

除了lukbl的答案之外,你可以在程序集范围内做同样的事情,所以如果你有多个测试类,那么在vstest.console.exe和#期间,你将对测试进行全局管理。 39; s运行时(例如,如果您多次调用它)。

应该注意你是如何使用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()类似。