如何在第一次失败时阻止MsTest测试执行?

时间:2013-04-08 05:35:41

标签: mstest vstest

我们正在运行每晚构建,最后使用MsTest框架运行所有UnitTest。

我们必须有100%的通过率,所以如果一个失败,那么运行其他人是没有意义的;因此,我们希望在第一次失败的测试中停止执行。

无论如何我们能做到吗?

1 个答案:

答案 0 :(得分:0)

你真的确定要丢弃测试结果吗?

说某人有糟糕的一天,并在您的代码中引入了多个错误A,B和C.你可能只在星期一找到关于A的信息,所以你解决了这个问题,直到星期二才知道问题B,然后你不会在星期三之前解决问题。但是由于您缺少半周的测试覆盖率,周一推出的错误直到它们推出几天才被发现,而且它更昂贵并且需要更长时间来修复它们。

如果在失败后继续运行测试不会花费太多,那么这些信息不是很有用吗?


也就是说,在测试库中修复一个修复程序并不会那么难。让所有可能的测试失败代码路径设置一个静态变量StopAssert.Failed = true;(可能是通过将调用包装到Assert并捕获AssertFailedExceptions。然后只需将[TestInitialize()]方法添加到每个测试类中以停止失败后的每次测试!

public class StopAssert
{
    public static bool Failed { get; private set; }

    public static void AreEqual<T>(T expected, T actual)
    {
        try
        {
            Assert.AreEqual(expected, actual);
        }
        catch
        {
            Failed = true;
            throw;
        }
    }

    // ...skipping lots of methods. I don't think inheritance can make this easy, but reflection might?

    public static void IsFalse(bool condition)
    {
        try
        {
            Assert.IsFalse(condition);
        }
        catch
        {
            Failed = true;
            throw;
        }
    }
}


[TestClass]
public class UnitTest1
{
    [TestInitialize()]
    public void Initialize()
    {
        StopAssert.IsFalse(StopAssert.Failed);
    }

    [TestMethod]
    public void TestMethodPasses()
    {
        StopAssert.AreEqual(2, 1 + 1);
    }

    [TestMethod]
    public void TestMethodFails()
    {
        StopAssert.AreEqual(0, 1 + 1);
    }

    [TestMethod]
    public void TestMethodPasses2()
    {
        StopAssert.AreEqual(2, 1 + 1);
    }
}

[TestClass]
public class UnitTest2
{
    [TestInitialize()]
    public void Initialize()
    {
        StopAssert.IsFalse(StopAssert.Failed);
    }

    [TestMethod]
    public void TestMethodPasses()
    {
        StopAssert.AreEqual(2, 1 + 1);
    }

    [TestMethod]
    public void TestMethodFails()
    {
        StopAssert.AreEqual(0, 1 + 1);
    }

    [TestMethod]
    public void TestMethodPasses2()
    {
        StopAssert.AreEqual(2, 1 + 1);
    }
}