CppUnit を使用して一連の単体テストをセットアップしていますが、テストが実行されていないという問題があります。プロジェクトはいくつかの小さなライブラリに分割されており、単体テスト クラスを同じように分割し、それらすべてを 1 つのテスト プログラムにリンクすることを計画しました。問題は、テストクラスが独自のライブラリにあり、明示的に呼び出さない限り、メインのテストプログラムにリンクされないことです。つまり、
runner.addTest( TestClass::suite() );
テストクラスごとに個別に、TestFactoryRegistry の makeTests() メソッドを使用してテストのリストを取得することはできません。それらをすべてトップディレクトリにまとめてコンパイルすると、 makeTests() メソッドは正常に機能しますが、できればすべてのテストクラスを1つの場所に配置したくありません。
CppUnit documentation は、次の小さなヒントを提供します
ヘルパー マクロ使用時のリンクの問題?
プロジェクトを作成し、その単体テスト スイートを作成する場合、いわゆるヘルパー マクロ (CPPUNIT_TEST_SUITE_NAMED_REGISTRATION、CPPUNIT_REGISTRY_ADD、および CPPUNIT_REGISTRY_ADD_TO_DEFAULT) を使用することで作業が容易になります。問題は、これらのマクロを TestFixture クラス (たとえば MyTest など) のソース コード ファイルで使用し、次のような行を使用する場合です。
runner.addTest( CppUnit::TestFactoryRegistry::getRegistry().makeTest()
);
ファイル main.cpp の main() 関数では、テストはまったく実行されません。
その理由は、ビルド プロセスのステップの 1 つであるリンク ステージが、main.cpp に未定義のシンボルがない場合、最終的な実行可能ファイルにオブジェクト ファイル (.obj または .o ファイル) を挿入しないためです。
このように、AutoRegister 静的変数のインスタンス化を含むオブジェクト コードは、最終的な実行可能ファイルの一部ではなく、main() 関数で自分自身をランナーに挿入することができません。
mytest.o ファイルが main.o と統合されて最終的な実行可能ファイルになるように、main.cpp に未定義のシンボルを作成する必要があります。
ミシェル・ノラールが犯したトリック
しかし、これを機能させる方法については述べていません。私は自分でそれを理解したり、オンラインで例を見つけることができないほど十分に密集しています。
これで、ライブラリごとに個別の実行可能テストを作成することができ、最終的にはそのようになる可能性がありますが、最初にこれを機能させたいと思ったので、実行するテストプログラムを 1 つだけ使用してすべてをテストしました。これを機能させる方法のアイデア/例はありますか?