2016-09-20 3 views
0

テストケースでは、デバッグモードで無効な入力に対してアサーションを生成する関数をテストしたいと思います。これは残念ながらCatchテストランナーを停止します。テストランナーが続けるように、このアサーションをバイパスする方法はありますか?ここでデバッグモードでユニットテストでアサートをバイパスする方法はありますか?

は私のテストケースである:

SCENARIO("Simple test case", "[tag]") { 
    GIVEN("some object") { 
     MyObject myobject; 

     WHEN("object is initialized with invalid data") { 
      // method init generates an assertion when parameters are invalid 
      bool result = myObject.init(nullptr, nullptr, nullptr, nullptr); 
      REQUIRE(false == result); 

      THEN("data processing can't be started") { 
      } 
     } 
    } 
} 
+0

アサーションは正しいプログラムでは決して起こらないようにしましょう。なぜあなたはそれをユニットテストしていますか?正しいプログラム内で無効なパラメータが発生する場合(たとえば、不正な形式のユーザー入力など)、アサーションの代わりに例外を使用する必要があります。 – Quentin

+0

@Quentin実際には、テストしたい外部ライブラリ(Matlabコードジェネレータで生成されています)です。生成されたコードのラッパーを生成しましたが、現実の生活の中で入力ファイルから来る可能性のある無効なデータをライブラリが処理できる場合は、実際には行っていません。私は、例外の使用が私たちの場合の主張よりも良い解決策かもしれないことに同意します。 – tommyk

+0

これはhttp://stackoverflow.com/q/38533272/102345と非常によく似ています – JBRWilkinson

答えて

1

通常assert

#define assert(e) ((void) ((e) \ 
    ? 0 
    : (void)printf ("%s:%u: failed assertion `%s'\n", __FILE__, __LINE__, #e), 
    abort(), // <-- this aborts you program after printf's above 
    0   
) 

のようなものをやっマクロです。このマクロはデバッグビルドでは有効になっています。詳細については、標準を調べてくださいassert.h

したがって、テストケースをリンクするバイナリライブラリがある場合、アサーションが有効になっていないリリースビルドを与えていない限り、開発チームに指示する必要があります、ネガティブなテストケースのためにAPIをユニットテストすることはできません。

あなたはヘッダのみのライブラリをテストする必要があるかをテストするソースコードに対してコンパイルする場合、あなたは-DNDEBUGを使用してテストケース/スイートをコンパイル

  1. する必要があります。 および/または
  2. は(あなたがつかまえるエラーをスローする。E、G)あなた自身のassertマクロを定義して、特定のassert.hがすでに定義されたかどうかをテストし、再び(再度、それを定義しようとしないことを願っていますあなたのコンパイラ/標準ライブラリで詳細を探してください)
関連する問題