我们正在运行每晚构建,最后使用MsTest框架运行所有UnitTest。
我们必须有100%的通过率,所以如果一个失败,那么运行其他人是没有意义的;因此,我们希望在第一次失败的测试中停止执行。
无论如何我们能做到吗?
答案 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);
}
}