天天看點

開源C++單元測試架構GoogleTest

    今天研究了下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