2010-12-03 15 views
1

「アサート」と「例外のスロー」の適切な使い方は何ですか?各シナリオはいつ適切ですか?アサートの適切な使用

シナリオ1

CODE

public Context(Algorythm algo) { 
    if (algo == null) { 
     throw new IllegalArgumentException("Failed to initialize Context"); 
    } 
    this.algo = algo; 
} 

TEST

public void testContext_null() { 
    try { 
     context = new Context(null); 
     fail(); 
    } catch (IllegalArgumentException e) { 
     assertNotNull(e); 
    } 
} 

シナリオ2

CODE

public Context(Algorythm algo) { 
    assert (algo != null); 
    this.algo = algo; 
} 

TEST

public void testContext_null() { 
    try { 
     context = new Context(null); 
     fail(); 
    } catch (AssertionFailedError e) { 
     assertNotNull(e); 
    } 
} 
+0

null例外をキャッチすることはできません。 assertNotNull(e)は真でなければなりません。 –

+1

JUnit 4を使用していますか?もしあなたがそうであれば、テストメソッドで 'try' /' catch'の代わりに '@Test(expected = IllegalArgumentException.class)'アノテーションを使用してください。 – Asaph

+0

そして、fail();またはテストが間違った理由で合格する可能性があります。 –

答えて

5

アサートとの主な違いです。

  • 選択したテストをクラス/パッケージ別にオン/オフする機能。
  • スローされたエラー。

アサーションは、本番環境ではオフになるテストに適しています。

毎回検査が必要な場合は、入力からデータを検証する場合は、毎回実行される検査を使用する必要があります。

1

Assertは、指定された式を真または偽として検証し、偽の値の場合に例外をスローするマクロ(C/C++または他の言語の関数)です。

アサートは、数式式が実際にあなたに適切な値を与えるかどうかをチェックする必要があるときや、オブジェクト/構造体メンバがnullでないか、重要なものが見つからないときなどにアプリケーションを変更するときに使用するものです。

例外投げは実際のエラー処理の詳細です。例外はエラーでもアプリケーションを停止することもできますが、アプリケーションの「小売バージョン」エラー処理として使用されます。これは、シンボルやメモリアドレスではなく、技術的ではないメッセージを使用して、例外をキャッチしてユーザーとは別の方法で取得できるためです。たとえば、アプリログにシリアル化するだけで済みます。

一方、アサーションは実行中のプロセスを停止し、「assertion failed on source_file.ext、X行」というメッセージを表示します。プロセスは終了します。それはユーザーフレンドリーではありません:)

0

条件を満たさないとプログラムの完全性に違反する場合は、assertキーワードを使用する必要があります。これらは、回復不可能なエラー状況を意図しています。

例外は、エラーの存在と場所へのメソッド呼び出しを警告しますが、プログラマの裁量で処理または無視することができます。

テスト時に、テストが合格する条件が満たされている必要がある場合は、Assert関数を使用する必要があります。あなたがその特定のテストで例外を期待している場合は、JUnitの4のテストは、特定の例外をスローする必要があることを意味する注釈があります、テストコードの

@Test(expected=MyException.class) 
0

外を主張するが、一般的に悪い考えです。その理由は、非常に厳しい会社のガイドラインがない限り、あなたはいつも悪い混在使用で終わることです。アサートのための2つの利用シナリオ基本的にあります。生産にオフになります

  1. 余分な、多分遅いテストがあることを指定したメソッドのパラメータを必要とするように(無効にするべきではありません
  2. 通常、迅速なコードの健全性テストnull以外)

シナリオのいずれかに従う限り、問題はありません。しかし、コードベースが両方のシナリオで終わると、あなたは立ち往生します。無効にしたくないシナリオ2に従うアサーションがあり、無効にしたいシナリオ1に従うアサーションがあります(プロダクションコードの速度が低下しています)。何をすべきか?

通常のコードでアサーションを使用していたコードベースのほとんどは、まさにこの理由でプロダクションビルドで無効になったことはありませんでした。したがって、私の推奨は常にテストコードの外でそれらを避けることです。通常のコードに対して通常の例外を使用し、別のテストコードに余分な、おそらく低速のコード(アサートあり)を貼り付けます。