2009-07-12 14 views
2

私は、アサートマクロを含むいくつかの関数をテストするという事実に関連するいくつかの懸念をassert.hから持っています。アサートとユニットテストは互換性がありませんか?

アサートに失敗すると、テストにも失敗します。 これは決してうまくいかないテストケースを私に残します。

たとえば、失敗を示す代わりに関数(falseを返すなど)がアサートします。

これに対する解決策がありますか(アサートを含む単体テスト機能)ですか?

答えて

7

いいえ、単体テストは開発中の作業です。アサーションは実行時の構造です。

私の経験では、大部分のアサーションはプロダクションではオフになっています。しかし、常にテストするべきです。

CppUnitは素晴らしいテストフレームワークです。これは、C++用のnUnitファミリの一部です。

9

多分私のものかもしれませんが、アサーションの失敗があれば、それらを修正するまで上位レベルのユニットテストについて考えるべきではありません。考え方は、コードが正しく書かれていれば、単体テストを含むいかなる状況下でも、アサーションはは決してで失敗しなければならないということです。それとも少なくとも私のコードを書く方法です。

+13

入力パラメータを検証するためのアサーションが存在する可能性があります。有効な単体テストは、「この関数は、ある種の悪い入力で予測可能な形で爆発する」というものです。 – Tom

1

基本的に、テストフレームワークがアサーションをテストするために構築されていないようです。

プロセスを停止するアサートでは、実行状態を監視するものが必要です。 http://www.boost.org/doc/libs/1_34_0/libs/test/doc/components/prg_exec_monitor/index.html

私はいくつかの時間でCまたはC++コーディングを行っていませんでした、しかし、私は同様の手法で始めたい:

後押しテストの方法の例を、この行います。

12

アサーションは、(入力が悪いときに)期待するときにアサートが中止するという事実をテストすることができます。

ASSERT_DEATHマクロとしてのテストフレームワークGoogle Testは、プログラムが(アサートのように)期待したところでアボートすることをテストします。

ユニットテストのアサーションを無効にするには、NDEBUG定義(-DNDEBUG with gcc)でコンパイルすることもできます。

2

アサーションはいかなる状況でも失敗しません。あなたのテストで失敗した場合、それは論理エラーを示します。基本的に、関数がエラーコードを返す代わりに "assert(0)"を実行している場合は、関数を書き直す必要があります。アボートが望ましい動作であれば、exit()は適切ですが、assert()は適切ではありません。

テスト中にアサーションに失敗した場合は、コードに誤りがあり、変更する必要があります。コード "assert(x)"は、 "プログラムの論理はxが真であることを要求していることを意味すると解釈されるべきであり、決して偽でないことができる。アサーションを失敗させるユニットテストがある場合、そのステートメントは明らかに無効であり、変更する必要があります。

+1

abortingが望ましい振る舞いであれば、 'abort()'を使うべきですが、 'exit()'を使うべきではないでしょう。 – Tom

+0

それは良い点です。おそらく私は "終わりが望ましい行動である"と言っていたはずです。 「中止」には、私が使用しようとしていなかった技術的な意味があります。 –

+1

そして、無効な入力引数をどうやってテストしますか?最初にそれらをアサートしてから、(生産コード用に)無効な入力パラメータがエラーの場合に関数から戻ります。 – philk

関連する問題