次のように整理された Visual Studio ソリューションがあります。
ProjectA // A static library I'm working on
ProjectB // A static library containing UnitTest++ test suites for ProjectA
ProjectC // An executable test runner which links to ProjectA and ProjectB
ProjectB には、次のような 2 つのファイルが含まれています。
// RunTests.h
#ifndef RUNTESTS_H
#define RUNTESTS_H
#include "UnitTest++.h"
int runAllTests();
#endif
この:
// RunTests.cpp
#include "RunTests.h"
int runAllTests()
{
return UnitTest::RunAllTests();
}
テストスイートを含むいくつかのファイルと同様に、例えば:
// FooTests.cpp
#include "RunTests.h" //
#include "Foo.h" // From ProjectA
TEST(SomeTest)
{
CHECK(true);
}
ProjectC は次の 1 つのファイルで構成されます。
// main.cpp
#include "RunTests.h" // from ProjectB
int main()
{
return runAllTests();
}
テストとテスト ランナーを分離した理由は、同じテストを使用してコード カバレッジを分析する別のプロジェクトがあるためです。クロスプラットフォームではないため、テスト ランナーは分離しておく必要があります。
問題は、ProjectC をコンパイルして実行すると、実際にはテストが実行されないことです (UnitTest++ は実行されますが、テストはゼロです)。これは、ProjectC が ProjectB からのテストに関連するシンボルを参照しないためです。したがって、リンカーは ProjectB.lib からのオブジェクト ファイルをリンクしません。
ドキュメントに従って、ProjectB が実行可能ファイルである場合、この問題は発生しないと理解しています (おそらく、リンカーがすべてのオブジェクト ファイルをリンクするため)。
一般的な考え方は、RunAllTests() を呼び出すエントリ ポイントを含む 1 つの Main.cpp ファイルを保持することです。
その後、通常はテスト スイートごとに 1 つの新しい .cpp ファイルを自由にコンパイルしてリンクできます。
各 Test*.cpp ファイルには、テスト コードが関連付けられた 1 つ以上の TEST マクロの呪文が含まれます。Main.cpp と Test*.cpp の間にソースレベルの依存関係はありません。TEST マクロは、RunAllTests() が同じ最終的な実行可能ファイルにコンパイルされたすべてのテストを見つけるために必要な登録とセットアップを処理するためです。
ProjectC が参照できるヘッダー ファイル内のすべてのテストを宣言することなく、この問題を解決するにはどうすればよいですか (UnitTest++ の使いやすさが失われます)。Visual Studio で気付いた 1 つの可能性は次のとおりです。
プロジェクト設定 > 構成プロパティ > リンカー > 入力 > シンボル参照を強制する
ただし、新しい単体テストを作成するたびに、すべてのシンボルを追加する必要があるのはかなり面倒です。ProjectB.lib の内容全体を強制的に含める方法はありますか? それとも、コードベースのソリューションでしょうか?
編集:私が探しているのは、このようなものですが、Visual Studio 用です。