天天看點

在mingw項目中引入googletest序編譯googletest添加至項目測試一下

之前的文章,介紹了如何在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

在mingw項目中引入googletest序編譯googletest添加至項目測試一下
  • 配置連結器

    需要将剛放置的靜态連結庫檔案,加入項目的連結路徑中,連結庫的路徑為

    $PROROOT/third-party/googletest/lib

    ,庫名為

    gtest

    同時,googletest需要多線程庫,是以也加入了

    pthread

在mingw項目中引入googletest序編譯googletest添加至項目測試一下

測試一下

至此,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.
           

繼續閱讀