我有這樣的組織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
項目B包含兩個文件看起來像這樣:
// 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);
}
項目C由一個單一的文件:
// main.cpp
#include "RunTests.h" // from ProjectB
int main()
{
return runAllTests();
}
我之所以有測試和測試運行分開,就是我有一個使用相同的測試,分析代碼覆蓋率,這是我需要保持另一個項目因爲它不是跨平臺的,而測試跑步者是。
問題是,當我編譯和運行ProjectC時,實際上沒有運行測試(UnitTest ++運行,但零測試)。這是因爲ProjectC沒有引用與ProjectB的測試有關的任何符號,所以鏈接器不會鏈接來自ProjectB.lib的對象文件。
這是我的理解是,如果項目B是一個可執行文件,我不會有這個問題(大概是因爲鏈接器將連接所有的目標文件),按照文件:
總的想法是,您使用調用RunAllTests()的 入口點保留一個Main.cpp文件。
然後,您可以隨意編譯和鏈接新的.cpp文件,通常每個測試套件都有一個 。
每個Test * .cpp文件將包含一個或多個TEST宏咒語以及相關的 測試代碼。 Main.cpp和Test * .cpp之間沒有源級別的依賴關係,因爲TEST宏處理註冊和設置 RunAllTests()查找編譯到相同的 最終可執行文件中的所有測試。
我怎麼能解決這個問題,而不必申報在頭文件中的所有測試,項目C可以看到(這會殺了單元測試+ +的易用性)?我在Visual Studio中發現一種可能是:
項目設置>配置屬性>鏈接>輸入>強制符號引用
但是這將是相當繁瑣不得不添加的每一個符號,每一次我寫時間一個新的單元測試。有什麼辦法可以強制它包含ProjectB.lib的全部內容嗎?或者也許一些基於代碼的解決方案?
編輯:我正在尋找的是類似this,但對於Visual Studio。
謝謝,我會稍後再試。 – JBentley 2013-04-12 09:33:06