我們正在運行夜間構建,最後運行我們的所有UnitTest使用MsTest框架。如何停止MsTest在首次失敗時測試執行?
我們必須有100%的合格率,所以如果一個失敗了,沒有意義的運行其他人;因此我們希望在第一次失敗的測試中停止執行。
反正我們可以做到嗎?
我們正在運行夜間構建,最後運行我們的所有UnitTest使用MsTest框架。如何停止MsTest在首次失敗時測試執行?
我們必須有100%的合格率,所以如果一個失敗了,沒有意義的運行其他人;因此我們希望在第一次失敗的測試中停止執行。
反正我們可以做到嗎?
你確定你想扔掉測試結果嗎?
說別人有糟糕的一天,並將多個錯誤A,B和C引入您的代碼中。你可能只會在週一發現A,所以你解決了這個問題,直到星期二你才知道問題B,然後到星期三你才解決C.但是,由於您錯過了半個星期的測試覆蓋範圍,因此週一發佈的錯誤直到推出後幾天才被發現,而且它更昂貴並且需要更長的時間才能修復它們。
如果在失敗後繼續運行測試並不花費太多,那麼這些信息是否有用?
也就是說,在測試庫中一起修復修復並不會那麼困難。有測試失敗的所有可能的codepaths設置一個靜態變量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);
}
}
任何人都有辦法做到這一點與配置設置?我們有很多代碼需要修改:( – Steve 2016-02-19 18:06:48
我有同樣的問題,任何人? – Zambonilli 2013-06-26 19:04:02