2009-06-19 69 views
6

我使用CppUnit設置了一堆單元測試,但遇到沒有任何測試正在運行的問題。該項目分爲幾個小型圖書館,我計劃以同樣的方式劃分單元測試課,然後將它們全部鏈接到一個測試程序中。問題是,那麼測試類在自己的圖書館,他們沒有得到鏈接到主測試程序,除非我明確地給他們打電話,也就是我必須把在CppUnit測試庫中鏈接

runner.addTest(TestClass::suite());

單獨爲每個測試類,並且不能使用TestFactoryRegistry的makeTests()方法來獲取測試列表。如果我只是將它們全部編譯在頂部目錄中,那麼makeTests()方法可以正常工作,但如果我可以提供幫助的話,我不想將所有測試類都放在一個位置。

的CppUnit的文檔提供了以下小提示

使用助手 宏時鏈接的問題? CPPUNIT_TEST_SUITE_NAMED_REGISTRATION, CPPUNIT_REGISTRY_ADD和 CPPUNIT_REGISTRY_ADD_TO_DEFAULT:

當你創建一個項目,並寫 其單元測試套件,該工作是通過使用 所謂的輔助宏製成 容易。所述 問題是,如果在一個 的TestFixture類的源代碼文件中使用的那些 宏(比方說MyTest的作爲 例子),以及如果使用的線像 這一個

runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest() 

);

你的main()函數在文件 main.cpp中,根本沒有測試運行 !

的原因很簡單,鏈接 階段,構建 過程的步驟之一,千萬不要在最後 可執行文件插入對象 文件(.OBJ或.o文件),如果沒有未定義 符號在你的main.cpp中。

這樣一來,其 包含autoRegister的靜態 變量實例化對象代碼不是 最後的可執行部分,並且不能 到自己插入澆道中 的main()函數。

你必須在main.cpp中創建一個未定義的符號 使得mytest.o文件 與main.o集成到 最終的可執行文件。

把戲米歇爾Nolard致力於

,但並沒有說如何使這項工作,我只是足夠密集不能夠找出自己或找上線的例子。

現在我可以爲每個庫做一個單獨的可執行測試,最後我可能會這樣做,但我想先試着讓這個工作,所以我只有一個測試程序來運行測試整件事。任何想法/例子如何讓這個工作?

回答

1

通過向main添加一個未定義的符號,他只是意味着創建任何隨機的外部符號來強制鏈接器搜索包含測試代碼的外部庫。

例如,假定兩個測試庫,弗雷德和巴尼,在fredTestLib.cpp你剛剛加入這一行:

int fredDummyInt = 0; // declare a unique symbol for the linker to resolve 

和barneyTestLib.cpp,你會添加類似的一行:

int barneyDummyInt = 0; // a different unique symbol for the linker to resolve 

您可以分別在不同的步驟中編譯每個庫。在主測試程序中,您然後強制鏈接器解決它們。所以,添加這些行的main.cpp:

extern int fredDummyInt; 
extern int barneyDummyInt; 
... 
main() { 
    ... 
    fredDummyInt++; // give the linker some symbols to resolve 
    barneyDummyInt++; 
    ... 

的想法(根據什麼把戲上面說的作者)是因爲鏈接已經爲fredDummyInt搜索fredTest.lib,它也會找到和解決您的自動註冊測試。

注:我沒有試過這個看看它是否有效!我只是回答你關於外部的問題。

另一種考慮的方法是在DLL中創建測試,並使用LoadLibrary()明確地使它們運行。對於過度使用,如果你使用MfcUi :: TestRunner,你可能會建立一個下拉式GUI的東西,讓你選擇要加載的庫,加載它,然後顯示測試在庫中運行,然後運行它們。

+0

今晚我會試試這個。 – dagorym 2009-06-24 15:59:49

0

這個問題的解決方案相當簡單,就像之前的statet(但可能不是很優雅)。 對於位於外部庫,你必須將以下代碼兩行添加主模塊

#include <CppUnitTestFixtureExample.h> 
CppUnitTestFixtureExample Test1; 

它創建未使用的未使用虛擬變量在每個的TestFixture,它只是強制鏈接鏈接測試夾具。現在位於主模塊中的測試運行器可以運行測試。

0

我意識到這篇文章現在已經很老了,但對於遇到它的任何人: 解決這個問題的一種方法是在代碼中引用(強制)鏈接器以包含整個靜態庫在二進制文件中。詳情面積可從GCC & ld的手冊頁,和這個職位涵蓋太: How to force gcc to link unreferenced, static C++ objects from a library

每ld的手冊頁,考慮明確關閉選項(在上面的例子中的一個所示)是很重要的。