1. ホーム
  2. unit-testing

[解決済み】Assert.Fail()はバッドプラクティスとみなされるか?

2022-01-23 08:59:01

質問

TDDを行う際、Assert.Failをよく使います。私は通常、一度に1つのテストに取り組んでいますが、後で実装したいもののアイデアを得たとき、私はすぐに空のテストを書き、テストメソッドの名前は、一種のTodoリストとして実装したいものを示しています。忘れないように、本文にAssert.Fail()を入れています。

xUnit.Netを試したところ、Assert.Failが実装されていないことがわかりました。もちろん、Assert.IsTrue(false)を使えばいいのですが、これでは私の意図がうまく伝わらないのです。意図的にAssert.Failを実装していないような印象を受けたのですが。これはバッドプラクティスとみなされるのでしょうか?もしそうなら、なぜですか?


マーティン・メレディス それは私のやり方とはちょっと違いますね。私は最初にテストを書き、それを動作させるためのコードを実装します。通常、私は一度に複数のテストを考えます。あるいは、他のことをやっているときに書くべきテストを思いつくこともあります。その時は、覚えておくために空の失敗テストを書きます。テストを書くまでに、私はきちんとテストファーストで作業しています。

ジンメ それは良さそうですね。無視されたテストは失敗しませんが、それでも別のリストに表示されます。試してみなければなりませんね。

マット・ハウエルズ いいアイデアだ。NotImplementedExceptionは、この場合assert.Fail()よりも意図を伝えることができます。

ミッチ・ウィート それを探していたんです。私が悪用する別の方法で悪用されるのを防ぐために、省かれたようです。

解決方法は?

このシナリオでは、Assert.Fail を呼び出すのではなく、次のようにしています (C# / NUnit の場合)。

[Test]
public void MyClassDoesSomething()
{
    throw new NotImplementedException();
}

Assert.Fail よりも明示的です。

Assert.Fail()よりももっと明示的なアサーションを使用することが望ましいというのが一般的な意見のようです。しかし、ほとんどのフレームワークは、より良い代替手段を提供しないため、これを含めざるを得ません。例えば、NUnit(とその他)は、あるコードが特定のクラスの例外を投げることをテストするためにExpectedExceptionAttributeを提供します。しかし、例外のプロパティが特定の値に設定されていることをテストするために、これを使うことはできない。代わりに、Assert.Fail を使う必要があります。

[Test]
public void ThrowsExceptionCorrectly()
{
    const string BAD_INPUT = "bad input";
    try
    {
        new MyClass().DoSomething(BAD_INPUT);
        Assert.Fail("No exception was thrown");
    }
    catch (MyCustomException ex)
    {
         Assert.AreEqual(BAD_INPUT, ex.InputString); 
    }
}

xUnit.NetのAssert.Throwsメソッドを使えば、Assert.Failメソッドを使わなくても、この処理を簡単に行うことができます。xUnit.Net では、Assert.Fail() メソッドを使わないことで、開発者がより明確な代替手段を見つけ、使用することを奨励しており、必要に応じて新しいアサーションの作成もサポートしています。