私は、アサートマクロを含むいくつかの関数をテストするという事実に関連するいくつかの懸念をassert.hから持っています。アサートとユニットテストは互換性がありませんか?
アサートに失敗すると、テストにも失敗します。 これは決してうまくいかないテストケースを私に残します。
たとえば、失敗を示す代わりに関数(falseを返すなど)がアサートします。
これに対する解決策がありますか(アサートを含む単体テスト機能)ですか?
私は、アサートマクロを含むいくつかの関数をテストするという事実に関連するいくつかの懸念をassert.hから持っています。アサートとユニットテストは互換性がありませんか?
アサートに失敗すると、テストにも失敗します。 これは決してうまくいかないテストケースを私に残します。
たとえば、失敗を示す代わりに関数(falseを返すなど)がアサートします。
これに対する解決策がありますか(アサートを含む単体テスト機能)ですか?
いいえ、単体テストは開発中の作業です。アサーションは実行時の構造です。
私の経験では、大部分のアサーションはプロダクションではオフになっています。しかし、常にテストするべきです。
CppUnitは素晴らしいテストフレームワークです。これは、C++用のnUnitファミリの一部です。
多分私のものかもしれませんが、アサーションの失敗があれば、それらを修正するまで上位レベルのユニットテストについて考えるべきではありません。考え方は、コードが正しく書かれていれば、単体テストを含むいかなる状況下でも、アサーションはは決してで失敗しなければならないということです。それとも少なくとも私のコードを書く方法です。
基本的に、テストフレームワークがアサーションをテストするために構築されていないようです。
プロセスを停止するアサートでは、実行状態を監視するものが必要です。 http://www.boost.org/doc/libs/1_34_0/libs/test/doc/components/prg_exec_monitor/index.html
私はいくつかの時間でCまたはC++コーディングを行っていませんでした、しかし、私は同様の手法で始めたい:
後押しテストの方法の例を、この行います。
アサーションは、(入力が悪いときに)期待するときにアサートが中止するという事実をテストすることができます。
ASSERT_DEATHマクロとしてのテストフレームワークGoogle Testは、プログラムが(アサートのように)期待したところでアボートすることをテストします。
ユニットテストのアサーションを無効にするには、NDEBUG定義(-DNDEBUG with gcc)でコンパイルすることもできます。
アサーションはいかなる状況でも失敗しません。あなたのテストで失敗した場合、それは論理エラーを示します。基本的に、関数がエラーコードを返す代わりに "assert(0)"を実行している場合は、関数を書き直す必要があります。アボートが望ましい動作であれば、exit()は適切ですが、assert()は適切ではありません。
テスト中にアサーションに失敗した場合は、コードに誤りがあり、変更する必要があります。コード "assert(x)"は、 "プログラムの論理はxが真であることを要求していることを意味すると解釈されるべきであり、決して偽でないことができる。アサーションを失敗させるユニットテストがある場合、そのステートメントは明らかに無効であり、変更する必要があります。
入力パラメータを検証するためのアサーションが存在する可能性があります。有効な単体テストは、「この関数は、ある種の悪い入力で予測可能な形で爆発する」というものです。 – Tom