今天研究了下GoogleTest,谷歌的C++測試開源架構,遇到了諸多問題,寫來總結下,也有段時間沒寫文章了! / 下載下傳http://code.google.com/p/googletest/,最新版本是1.5.0 解壓,以後會出現,本來想上傳截圖,可惜垃圾QQ不支援Chrome,郁悶, build-aux,codegear,fused-src,include,make,msvc等 這裡隻介紹使用VS2008的方法, 先去掉msvc檔案夾的隻讀屬性,因為VS更新工程的時候,會修改一些内容,否則報錯。 一共有:gtest.sln 和gtest-md.sln兩類工程 這裡先解釋下差別:最開始的時候,在我編譯成功以後, 接着建立測試demo項目。建立win32 console項目,在項目屬性中設定附加include目錄, 根據編譯環境是debug或release添加對應的附加依賴項gtestd.lib或gtest.lib。設定附加庫路徑為對應的lib路徑。寫好測試程式後編譯工程,結果出現了很多“無法解析的外部符号”類型的錯誤。但是lib都已經添加了 錯誤原因: 編譯測試程式時,項目屬性/C++/代碼生成/選項中,C++的運作庫設定與編譯gtest庫時的運作庫設定不同 其中gtest.sln和gtest-md.sln對應就應該是這兩類工程 在編譯gtest庫時項目設定中運作庫設定成了“多線程調試(/MTd)”,而VS2008預設項目設定是“多線程調試 DLL (/MDd)”,導緻很多函數符号無法解析。 解決:修改運作庫設定,運作庫必須與生成gtest.lib的運作庫設定相同 轉載一篇文章: http://tech.ccidnet.com/art/1081/20060310/474235_1.html VC帶的編譯器名字叫cl.exe,它有這麼幾個與标準程式庫有關的選項: /ML、/MLd、/MT、/MTd、/MD、/MDd。這些選項告訴編譯器應用程式想使用什麼版本的C标準程式庫。/ML(預設選項)對應單線程靜态版的标準程式庫(libc.lib);/MT對應多線程靜态版标準庫(libcmt.lib),此時編譯器會自動定義_MT宏;/MD對應多線程DLL版(導入庫msvcrt.lib,DLL是msvcrt.dll),編譯器自動定義_MT和_DLL兩個宏。後面加d的選項都會讓編譯器自動多定義一個_DEBUG宏,表示要使用對應标準庫的調試版,是以/MLd對應調試版單線程靜态标準庫(libcd.lib),/MTd對應調試版多線程靜态标準庫(libcmtd.lib),/MDd對應調試版多線程DLL标準庫(導入庫msvcrtd.lib,DLL是msvcrtd.dll) 解釋以後,打開gtest-md.sln,因為一般MS預設的Console工程一般都是MDd的,裡面有四個工程,最下面兩個是例子程式,直接編譯gtest-md工程,在msvc的 debug裡,有lib檔案,拷貝lib檔案,并把gtest解壓包裡的incude/gtest 檔案夾拷貝到 VC9.0下, 然後建立 console工程 編寫code和測試代碼,在link裡的input連結gtestd.lib, 示例code如下: #include<iostream> using namespace std; #include <gtest/gtest.h> int Foo(int a, int b) { if (a == 0 || b == 0) { throw "don't do that"; } int c = a % b; if (c == 0) return b; return Foo(b, c); } TEST(FooTest, HandleNoneZeroInput) { EXPECT_EQ(2, Foo(4, 10)); EXPECT_EQ(6, Foo(30, 18)); } int _tmain(int argc, _TCHAR* argv[]) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } 這樣就可以了,這是一個非常簡單的例子,希望以後能養成寫UnitTest的習慣,參考文章。 http://www.cnblogs.com/tobyforever/archive/2009/05/01/1447473.html http://www.cnblogs.com/coderzh/archive/2009/04/06/1426758.html |