2009-09-26 6 views
8

私はデータアクセスクラスでこのメソッドを持っていますが、正しく動作するかどうかを確認するユニットテストがありますが、テストでは例外がテストされないため、例外を強制する新しいテストを作成する必要があります私はちょうど例外の場合にcatchブロックがうまくいくと信じていますか?それは努力する価値がありますか?あなたは...これは例外ハンドラをテストするために発生した例外を強制的に意味するであろうことができ、コードのすべての行をテストしよう、と確認する必要があり、理想的にはテストするために例外を強制する必要がありますか?

public void UpdateProject(Project project) 
    { 
     using (var transaction = _session.BeginTransaction()) 
     { 
      try 
      { 
       _session.Update(project); 
       _session.Flush(); 
       transaction.Commit(); 
      } 
      catch (HibernateException) 
      { 
       transaction.Rollback(); 
       throw; 
      } 
     } 
    } 

答えて

11

:ここ

は一例ですこれは正しく動作します。

実際には、常にいくつかのコード行が含まれていますが、特に重要であると感じる例外ハンドラをテストするために、モックを使用して例外を強制します。

+5

クラッシュがそれだけでログインして再スローだ場合、私は気にしないだろうcatchブロック – Mark

+2

にある生産の問題をデバッグすることは常に楽しいです。多分。限り、私は他の場所でログをテストしていた。それが何か重要なことをしているなら、私はそうするでしょう。 – serialhobbyist

+2

うん - トランザクションをロールバックすることができますが(常にではない)私は信じてかなり重いプロセスは、テストする必要があります。この場合、私はおそらくそれをテストするだろう。 –

3

あなたのセッションでは例外をスローすることができますが、キャッチが動作することをテストする必要はほとんどありません。

アップデートが例外をスローするとトランザクションがロールバックされていることを確認するテストを書くのは間違いではありませんが、これはぎっしりとしていると思います。

多分もっと精巧なケースがそれを保証するでしょう。

追加の注意点として、どのようなタイプの例外でもロールバックしませんか?

1

例外名(HibernateException)から例外的なケースではないと思います。したがって、通常の操作中に発生する可能性があります。その場合、私は例外が正しく処理されることを確認するテストを行います。

9

Linuxカーネルでは、ドライバのバグの80%がエラー処理コードになっています。

例外的な処理は多くのエラーの原因であり、確かにはすべての例外パスをテストする必要があります。

もちろん、すべてのコード行をテストすることはできません。しかし統計によると、プログラマは例外処理に注意を払わないので、完全にテストする必要があります。

3

Displose()がCommit()の前に呼び出された場合、トランザクションがロールバックされることを望みます。したがって、キャッチはまったく必要ですか?

他のケースでは、キャッチが問題を記録するだけであれば、私はそれが単体テストであるべきだと思います。 しかし、あなたが利益ユニットテストをすることができないという事実は、あなたが何らかのユニットテストをやめないようにしてはいけません。

1

私は確かに捕らえられ、処理される特定の例外をテストします。少なくとも実行時にこのような例外に遭遇した場合には/それ以外の何も起こらない慰めを与えるべきあなたのハンドリングコードを通していくつかの実行パスがあります。

作業するコードをテストするだけで済みます。

1

transaction.Rollback()を別途テストして、考えられる可能性のあるすべての状況をテストすることを願っています。しかし、テストが網羅的であれば、ハンドラには何もないので例外を発生させることはないでしょう。ここで

4

は、障害時の動作の理想的なテストのための私のルールです:

  • あなたは、例外がスローされることがあります依存関係を使用している場合は、それらのあなたのモックが例外をスローにするユニットテストを含める必要があります。
  • 一定の条件の下であなたのコードは例外をスローする必要がある場合、あなたは、このような条件を設定ユニットテストを含める必要があります。

最初あなたのコードは、外部の故障下のように振る舞い、そして多くの場合、何をすべきかの再検討につながるかを知ることができます。どのような状況においても、実際に何が起こるかを知ることは良いことです。 はちょうど限りエラーなど、あなたのコードを検出し、例外的な考慮すべきである、あなたが約束するものを保持することを確認します。コード内の他の機能をテストすることと同じです。

ユニットテストスイートを完全に検討する前に、テスト対象コードのコードカバレッジを参照する必要があります。非自明なコードについては、私のユニットテストをカバーし、または悪化していない一方通行私のコードの分岐がほとんど常にあり、私は意図していなかった振る舞いを持っています。驚くほど多くの場合、解決策はテストを追加するのではなく、そのコードを削除することです。それを先に羽ばたくときにちょうど残った。

必ずしも100%のカバレッジに到達する必要はありませんが、コードカバレッジに基づくユニットテストは、存在するコードビヘイビアを理解して公開するより視覚的な方法で行う必要があります。ちょうどそれを見ると、あなたにSingle Responsibility PrincipleSeparation of Concernsを達成するためにコードをリファクタリングする方法のための新しいアイデアを与えることができます。

関連する問題