簡體   English   中英

如何從測試運行程序可執行文件中的靜態庫鏈接測試?

[英]How to link tests from static library in test runner executable?

我有一個這樣組織的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包含兩個看起來像這樣的文件:

// 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包含一個文件:

// main.cpp

#include "RunTests.h" // from ProjectB

int main()
{
   return runAllTests();
}

我將測試與測試運行程序分開的原因是,我有另一個項目使用相同的測試來分析代碼覆蓋率,因此我需要將其分開,因為它不是跨平台的,而測試運行程序卻是跨平台的。

問題是,當我編譯並運行ProjectC時,實際上沒有測試在運行(UnitTest ++運行,但測試為零)。 這是因為ProjectC沒有引用與ProjectB中的測試相關的任何符號,因此鏈接器不會鏈接ProjectB.lib中的目標文件。

據我了解,如果ProjectB是可執行文件,則不會出現此問題(大概是因為鏈接器將鏈接所有目標文件),根據文檔:

通常的想法是,保留一個Main.cpp文件,其中包含調用RunAllTests()的入口點。

然后,您可以簡單地隨意編譯和鏈接新的.cpp文件,通常每個測試套件一個。

每個Test * .cpp文件將包含一個或多個帶有相關測試代碼的TEST宏指令。 Main.cpp和Test * .cpp之間沒有源級別的依賴關系,因為TEST宏處理RunAllTests()查找所有編譯為同一最終可執行文件的測試所必需的注冊和設置。

如何解決此問題而不必在ProjectC可以看到的頭文件中聲明所有測試(這會破壞UnitTest ++的易用性)? 我在Visual Studio中注意到的一種可能性是:

項目設置>配置屬性>鏈接器>輸入>強制符號引用

但是,每次我編寫一個新的單元測試時,必須添加每個符號都會很繁瑣。 有什么辦法可以強迫它包含ProjectB.lib的全部內容? 還是一些基於代碼的解決方案?

編輯:我要找的是像這樣 ,但為Visual Studio。

我試圖以與您描述的方式相同的方式使用UnitTest ++,並遇到相同的問題。 我在另一個似乎對我的單元測試可執行文件(即ProjectC)有效的論壇中遇到了一個建議。

對於ProjectC:項目設置>通用屬性>(選擇ProjectB)>使用庫依賴輸入:True

這對我有用。 我認為這樣做是有效地將任何對象文件從ProjectB鏈接到ProjectC(而不是鏈接庫)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM