web-dev-qa-db-ja.com

テストメソッドでtry catchを使用する必要がありますか?

単体テストを行っています。

1つの機能をテストしようとしています。

テストコンポーネントから呼び出します。しかし、リモート関数が例外を処理できない場合、私のテスターコンポーネントも例外を受け取ると思います。

では、テスターコンポーネントで例外が発生することを心配する必要がありますか?

ありがとう。

編集:

PS:

エラーをスローするのは良いことですが、他の機能に対してのみであり、最後のオプションになるまでエンドユーザーにはできません!

OMGプログラミングの引用を書いた!!

19
Vikas

短い答え:いいえ。

単体テストで例外をキャッチしないでください。ユニットテストを行って、例外が発生するエラーや状況を見つけます。

単体テストフレームワークは、例外を適切に処理する必要があります。ほとんど(すべてではない)のxUnitフレームワークには、テスト対象のシステムで特定の例外条件を引き起こしたいときに使用するexpect特定の例外の構成があり、予期される例外が発生した場合にテストに合格します。そうでない場合は失敗します。

23
mcottle

(mcottleの回答とは対照的に)長い回答:いいえ...ほとんどの場合

テストで特定の例外が発生すると予想すると、そのテストのどの行でもその特定の例外が発生することがわかります。

これは、テスト対象のメソッドが例外をスローすることを知ることとはまったく同じではありません。

テストにオブジェクトまたはコンテキストの設定が含まれる場合(テスト内で、フレームワークのSetUpのバージョン内ではありません)、実際にテストする1行をtry/catchでラップする方がよい場合があります。ヘルパー付き。

例えば、

public static class AssertHelper {
    public delegate void Thunk();

    public static void DoesNotThrow<T>(Thunk thunk, string message = "")
        where T: Exception {
        try {
            thunk.Invoke();
        } catch(T) {
            Assert.Fail(message);
        }
    }
}

その後

[TestMethod]
public void assertHelperInAction() {
    // Random setup stuff here that's too annoying to put in my SetUp
    // method.
    AssertHelper.DoesNotThrow<IllegalArgumentException>(() =>
        {/* My random method under test */})
}

このテストが失敗した場合、テスト中のメソッドが例外をスローし、ランダムセットアップのものではなかったことがわかります。

(ランダムなセットアップを試して回避する必要があります。場合によっては、テストにセットアップコードを含める方が簡単です。)

5
Frank Shearar

一般的には、例外を排除するだけでよく、テストフレームワークは必要なすべての情報を含む素晴らしいレポートを提供します。


しかし、TDD方法論では、次の手順に従うことが期待されます。

  1. テストを書く
  2. 失敗するのを見て、エラーをわかりやすくする
  3. コードを修正する
  4. コードとテストをリファクタリングする

例外を送出するときにエラーが明らかであれば問題ありません。しかし、例外はあいまいである場合や、誤解している場合さえあります。どうすればそれをコードに含めることができますか?したがって、私のポリシーは次のとおりです。「失敗を明確にする必要がある場合は、例外をキャッチする必要があります "。

1
KLE