最後に MsTest フレームワークを使用してすべての UnitTest を実行するナイトリー ビルドを実行しています。
合格率は 100% でなければならないため、1 つが失敗した場合、他のものを実行しても意味がありません。したがって、最初に失敗したテストで実行を停止したいと考えています。
とにかくそれを達成できることはありますか?
本当にテスト結果を破棄してもよろしいですか?
誰かが悪い日を過ごし、複数のバグ A、B、および C をコードに導入したとします。A については月曜日にしかわからないかもしれないので、それを修正し、B の問題については火曜日まで知りません。C については水曜日まで修正しません。しかし、半週間にわたってテスト カバレッジを欠いていたため、月曜日に導入されたバグは、導入されてから数日後まで発見されず、より費用がかかり、修正に時間がかかります。
失敗した後もテストを実行し続けるのにそれほど費用がかからないのであれば、その情報は役に立ちませんか?
とはいえ、テスト ライブラリで修正をハッキングすることはそれほど難しくありません。テスト失敗の可能性のあるすべてのコードパスに静的変数を設定させます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);
}
}