私は常に Boost Test での自動登録を使用していました。さて、私は、手動登録は何のためにあるのだろうか?自動登録で対応できないケースはありますか?
補足ですが、今回はモックにもタートルを使用します。
編集:私の質問は明確ではないようですが、より正確には:
- 自動登録の代わりに手動登録を使用する必要があるのはどのような場合ですか?
- なぜそうするのですか?自動登録では不十分な実際の状況とは?
私は常に Boost Test での自動登録を使用していました。さて、私は、手動登録は何のためにあるのだろうか?自動登録で対応できないケースはありますか?
補足ですが、今回はモックにもタートルを使用します。
編集:私の質問は明確ではないようですが、より正確には:
ドキュメントによると
この問題を軽減するために、UTFは、テストツリーでの自動化された(インプレースの)テストケースの作成と登録のための機能を提供します。これらの機能は、いくつかの一般性を犠牲にして、選択されたテスト関数の署名に対してのみ機能します。
しかし、自動テスト登録が失敗するという状況に遭遇したことはありません。BOOST_AUTO_TEST_CASE
たとえば、関数(with )、関数テンプレート(with BOOST_AUTO_TEST_CASE_TEMPLATE
)、およびFixtureクラスのメンバー関数(with)をテストできますBOOST_FIXTURE_TEST_CASE
。
何をどの順序でテストするかをきめ細かく制御したい場合。たとえば、コマンドライン引数に基づいています。
私の場合、テストをどのように実行したかったかという理由から、手動登録の方が簡単でした。
これは、それぞれが同じインターフェースを実装する多数のクラスに適用された少数のテストがあったためです。これらは、多くの異なるファイル形式をサポートするファイル形式ハンドラーであり、それぞれに対して同じ一連のテストを実行したかった (たとえば、各形式のファイルを開いて、いくつかのデータを読み取ろうとするなど)。
もともと自動登録を使用していたため、サポートされているファイル形式ごとにテスト ケースを複製する必要がありました。私は実際に#include
プリコンパイラのトリックを使ってこれを行いましたが、それでも維持するのは困難でした。
代わりに、手動登録に切り替えました。これにより、1 セットのテストを作成し、それらのテストをツリーに何十回も追加して、各コピーを異なるクラスに対して実行することができます (各ファイル形式をテストするため)。はかなりきれいになり、ほとんどの#ifdef
行がなくなりました。これは素晴らしいことです。
あなたの質問への答えは、C++ コーディングの問題をメタプログラミングで解決するかどうかに似ています。C++ メタプログラミングは、自動コピー アンド ペーストに少し似ているため、入力するコードを減らし、より一般的なアルゴリズムを記述して、代わりにコンパイラに作業を任せることができます。Boost.Test を使用した手動登録も同様で、テストを個別にリストするのではなく、アルゴリズム (コード) でリストを指定できます。
もちろん、ほとんどのテストが一意であり、同じテストを異なるパラメーターで繰り返し実行していない場合は、手動登録に切り替えてもメリットがない可能性があります。
でクラスメンバー関数を使用したりboost::bind
、引数を関数にバインドしたりできます。
無料の関数ベースのテストケースのみを使用する場合は、自動登録機能に進みます 自動登録に切り替えるのは本当に簡単です。もう忘れたテストケースについて心配する必要はありません
http://www.boost.org/doc/libs/1_50_0/libs/test/doc/html/utf/usage-recommendations/generic.html