序
之前的文章,介紹了如何在windows下使用 mingw 和 eclipse 來搭建 C++ 的開發環境。這篇文章在此基礎上,介紹如何在項目中引入著名的單元測試架構 googletest。
有關于單元測試和 googletest 的測試和可以參考這兩篇文章:單元測試, googletest
簡單的說,單元測試時用來保證程式單元的穩定性,自底而上消除程式中可能存在的隐患。而googletest是一個友善進行 C++ 程式單元測試的架構。
編譯googletest
googletest以開源源碼的形式提供,需要自己在項目所在平台中進行編譯,這一小節介紹如何編譯googletest庫
下載下傳源碼
googletest的源碼在github上托管,托管的位址是https://github.com/google/googletest
下載下傳源碼的方式很簡單,配置好你的git後,使用如下指令擷取源碼
# clone source
git clone https://github.com/google/googletest.git
# checkout newest tag
git checkout release-.
注意到,在上面的指令中 checkout 出了最新的 tag, 這是因為master分支上的代碼不一定能夠編譯的過
安裝CMAKE
googletest使用cmake來生成makefile,是以我們需要下載下傳并安裝 cmake 工具。有關 cmake 的介紹可以參考這篇文章
安裝cmake的方法很簡單,從這裡下載下傳最新的 cmake zip壓縮包。我下載下傳時,最新版本是3.4.2。
下載下傳好後,打開壓縮包,将其中的
bin
和
share
目錄,複制到mingw的安裝目錄下。
将
mingw
下的
bin
目錄添加進系統PATH中。比如,我的mingw安裝目錄為
c:\mingw32
則在PATH中添加
c:\mingw32\bin
編譯gtest
開打windows指令行工具,切換至googletest所在目錄,執行如下指令進行編譯
# 編譯c++11标準的版本
cmake -G "MinGW Makefiles" -DCMAKE_CXX_FLAGS=-std=c++
# 或者 編譯c++98标準的版本
cmake -G "MinGW Makefiles"
# 待cmake生成Makefile之後,執行
mingw32-make
至此,googletest就編譯完畢了。可以在googletest對應的目錄下,發現libgtest.a靜态連結庫
添加至項目
編譯完成後,我們需要将googletest引入到項目中。這裡以eclipse為例來介紹。
放置googletest庫
首先,要将gtest庫放到一個方面使用的位置。以vinsonlib項目為例,我将其放入到了
$PROROOT/third-party/googletest
下。
方法是,在
$PROROOT/third-party/googletest
下建立兩個目錄
include
和
lib
。然後複制
$GTESTROOT/include/gtest
到
$PROROOT/third-party/googletest/include
,複制
$GTESTROOT/libgtest.a
到
$PROROOT/third-party/googletest/lib
配置項目
然後,對項目進行必要的配置。
-
配置編譯器
需要将剛才放入的頭檔案,加入項目的include路徑中,include路徑為
$PROROOT/third-party/googletest/include
-
配置連結器
需要将剛放置的靜态連結庫檔案,加入項目的連結路徑中,連結庫的路徑為
,庫名為$PROROOT/third-party/googletest/lib
同時,googletest需要多線程庫,是以也加入了gtest
pthread
測試一下
至此,googletest庫就引入到項目了,下面我們來測試一下。建立一個檔案,寫入一下内容,編譯運作
#include "gtest/gtest.h"
int foo () {
return ;
}
TEST(FooTest, test) {
EXPECT_EQ(, foo());
}
int main(int argc, char* argv[]) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
如果一切正常,則會看到如下輸出
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from FooTest
[ RUN ] FooTest.test
[ OK ] FooTest.test (0 ms)
[----------] 1 test from FooTest (0 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[ PASSED ] 1 test.