2013-02-27 48 views
0

我有這樣的組織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。

回答

0

我試圖使用UnitTest ++,就像你描述的一樣,並遇到同樣的問題。我在另一個論壇中遇到了一個似乎適用於我的單元測試可執行文件(即ProjectC)的建議。

對於項目C: 項目設置>通用屬性>(選擇項目B)>使用庫的依賴輸入:真

這爲我工作。我認爲這樣做有效地將ProjectB中的任何對象文件鏈接到ProjectC中(而不是鏈接庫)。

+0

謝謝,我會稍後再試。 – JBentley 2013-04-12 09:33:06

相關問題