assert.hの assert マクロを含むいくつかの関数をテストするという事実に関連するいくつかの懸念があります。
アサートが失敗すると、テストも失敗します。これにより、決して機能しないテストケースがいくつか残ります。
たとえば、関数は失敗を示す代わりに (false を返すなど) アサートします。
これに対する解決策はありますか (アサートを含む単体テスト関数)?
assert.hの assert マクロを含むいくつかの関数をテストするという事実に関連するいくつかの懸念があります。
アサートが失敗すると、テストも失敗します。これにより、決して機能しないテストケースがいくつか残ります。
たとえば、関数は失敗を示す代わりに (false を返すなど) アサートします。
これに対する解決策はありますか (アサートを含む単体テスト関数)?
そのアサートが予期したときに (不適切な入力で) 中止されるという事実をテストすることができます。
ASSERT_DEATH マクロとしてのテスト フレームワークGoogle Testは、プログラムが予期した場所で (アサートのように) 中止されることをテストします。
単体テストのアサーションを無効にするために、NDEBUG を定義して (gcc で -DNDEBUG を) コンパイルすることもできます。
それは私だけかもしれませんが、アサーション エラーが発生した場合は、修正されるまで高レベルの単体テストについて考えるべきではないと思います。コードが適切に記述されていれば、単体テストを含め、どのような状況でもアサーションが失敗することはありません。または、少なくともそれが私のコードの書き方です。
いいえ、単体テストは開発中に行うものです。アサートは実行時の構造です。
私の経験では、ほとんどの場合、アサートは本番環境ではオフになっています。ただし、常にテストする必要があります。
CppUnit は優れたテスト フレームワークです。C++ の nUnit ファミリの一部です。
アサーションは、どのような状況でも失敗することはありません。テストで失敗した場合は、論理エラーを示しています。基本的に、関数がエラー コードを返す代わりに「assert( 0 )」を実行している場合は、関数を書き直す必要があります。中止が望ましい動作である場合、exit() は適切ですが、assert() は適切ではありません。
テスト中にアサーションが失敗した場合は、コードにエラーがあり、変更する必要があります。コード「assert( x )」は、「プログラムのロジックでは、x が true である必要があります。どのような状況でも false になることはありません」と解釈する必要があります。アサーションが失敗する原因となる単体テストがある場合、ステートメントは明らかに無効であり、変更する必要があります。
基本的に、テスト フレームワークは、アサーションをテストするために構築されていないようです。
プロセスを停止するアサートでは、実行状態を監視するものが必要です。
ブーストテストがこれを行う方法の例: http://www.boost.org/doc/libs/1_34_0/libs/test/doc/components/prg_exec_monitor/index.html
私はしばらく C または C++ のコーディングを行っていませんが、同様の手法から始めたいと思います。