2011-02-03 9 views
6

は、私は、それがクラスA、B、C、およびD、例えば、定義済みの一連で動作要件を持つ関数テンプレートC++テンプレートのテストを書くには?

template<T> void f(T); 

からなるテンプレートライブラリを書いて、次のコンパイルする必要がありますしていたと:

テストフレームワークは、私がテストコードのコンパイルで失敗するのではなく、実行時に、この要件をキャプチャし、テストケースを記述するために使用することができます
template<> void f(A); 
template<> void f(B); 
template<> void f(C); 
template<> void f(D); 

?別の言い方をすれば、フレームワークでランタイムのテンプレートをインスタンス化し、それらのサブセットが失敗した場合にきれいにフォーマットされたエラーレポートを生成したいと思います。

私はテストフレームワークをあきらめることができ、上の4行を含む単純なccファイルを単純に書くことができます。しかし、テストステータスレポートを生成するための標準的なテストケースに、この要件を組み込むことができれば幸いです。たとえば、

test f works with A: passed. 
test f works with B: passed. 
test f works with C: failed! Cannot cast type C! 
test f works with D: passed. 

3 of 4 tests passed. 
1 of 4 tests failed. 

答えて

5

コンパイラを生成するテストケースを作成します。 autoconfはフィーチャの存在をテストします。

+0

+1:これはコンパイラのテスト方法です:p LLVM/Clangの 'lit'フレームワークを見てみましょう。これは、テストの隣のコメントに予想されるエラーを指定することができます。 –

1

ここでテストしようとしている内容に基づいて、コンパイルできるかどうかを確認するだけで実行できる賢明なテストです。

テストはテストのためではなく、機能の正確さを保証するために行うべきです。あなたのクラスについて適切なテストをしたいのであれば、コンパイル可能な4つのクラスすべてでテンプレートの機能を検証するテストを書くべきです。

2

なぜ私は実行時に失敗するのがコンパイル時に失敗するのが望ましいのか分かりません。あなたが早くユニットテストのプロセスに失敗するほど良いでしょう。単体テストをコンパイルできない方が良いです。実際にはソース管理にコミットされていないこともあります。ユニットテストでは、これらの4行を含め、最後に真を表明する必要があります。これは私が自分でそれをやり遂げる方法ではないことに注意してください。

+0

すべての機能仕様をキャプチャしたいので、プロジェクトの進捗状況として報告される単体テストとして取得してください。テストプログラムがコンパイルされなくても、渡されたテストも報告されません。 – kirakun

+0

おそらく、テストプログラムをテストごとに1つずつ複数のプログラムに分割する必要があります。それは上で説明した問題を避けるでしょう。 –

2

C++テンプレートはコンパイル時の機能です。多くの場合、設計時にコンパイル時に失敗します。あなたは単にこれを回避することはできませんwithout doing something really crazy

ただし、特殊化はテンプレートから得られる動作を上書きするため、テンプレートの特殊化が正しいことを知りたい場合もあります。専門分野をテストしてください。しかし、テンプレートのコンパイル時には決して慣れることはできません。

関連する問題