Googletest的入門安裝和使用
1. Gtest介紹
gtest是一個跨平臺的(Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++單元測試框架,由google公司發佈。gtest是爲在不同平臺上爲編寫C++測試而生成的。它提供了豐富的斷言、致命和非致命判斷、參數化、”死亡測試”等等。
一句話就是Gtest提供了一種自動化測試程序的框架。方便快速的驗證程序的邏輯性和健壯性。
2. Gtest安裝
和所有的第三方庫一樣,安裝之前需要先下載源代碼。小夥伴們可以通過google官網進行下載google官網,當然在國內不翻牆是不能登入到google的。所以在此我們只能通過github進行下載googletest。如下:
首先創建一個工作目錄gtest
mkdir ~/gtest
cd ~/gtest
git clone https://github.com/google/googletest.git
下載完成之後接下來就可以針對不同的平臺進行編譯和使用了。下面將針對Ubuntu和linux ARM進行測試。
2.1. Gtest編譯
Gtest提供了兩種方式編譯源碼庫:automake和cmake,在此我們將以cmake方式進行編譯。
編譯之前我們先創建一個編譯目錄gtest-build,這樣避免在源碼目錄進行編譯造成污染問題。
創建一個編譯目錄
mkdir ~/gtest/gtest-build
cd gtest-build
cmake ../googletest -DCMAKE_INSTALL_PREFIX=./_install
make && make install
執行以上命令後將會在_install目錄下看到編譯產出的文件了。
.
├── include
│ ├── gmock
│ └── gtest
└── lib
├── cmake
├── libgmock.a
├── libgmock_main.a
├── libgtest.a
├── libgtest_main.a
└── pkgconfig
2.2. Gtest交叉編譯
狹義簡單理解交叉編譯就是人爲的指定目標平臺的工具鏈進行編譯產出可執行文件或庫文件。 使用默認的工具鏈通常情況即爲宿主機編譯。
既然是這樣那我們將在前面編譯的基礎上指定工具鏈就可以了。
創建一個arm平臺編譯目錄
mkdir ~/gtest/gtest-build-arm
cd gtest-build
cmake ../googletest -DCMAKE_INSTALL_PREFIX=./_install -DCMAKE_CXX_COMPILER=${TOOLCHAIN_PATH}/bin/aarch64-rockchip-linux-gnu-g++
make && make install
2.3. Gtest example編譯
Gtest源碼庫直接提供了大量的測試用例,我們可以直接拿來參考和學習。
首先我們可以直接進行編譯並運行測試進行感知Gtest的使用過程。那麼應該如何編譯呢,我們只需在上面編譯的選項中添加一個宏即可:gtest_build_samples=ON,然後重新編譯將會在googlemock/gtest看到多 了一些可執行文件:
googlemock/gtest/
├── CMakeFiles
├── cmake_install.cmake
├── CTestTestfile.cmake
├── generated
├── Makefile
├── sample10_unittest
├── sample1_unittest
├── sample2_unittest
├── sample3_unittest
├── sample4_unittest
├── sample5_unittest
├── sample6_unittest
├── sample7_unittest
├── sample8_unittest
└── sample9_unittest
2 directories, 13 files
3. Gtest第一個測試程序
// gtest_sum.cpp
#include <iostream>
#include <gtest/gtest.h>
int sum(int a, int b) {
return a+b;
}
TEST(sum, testSum) {
EXPECT_EQ(5, sum(2, 3)); // 求合2+3=5
EXPECT_NE(3, sum(3, 4)); // 求合3+4 != 3
}
// 如果在此處不寫main函數,那麼在鏈接庫的時候還需要鏈接-lgtest_main, 否則只需鏈接-lgtest即可。
#if 0
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
#endif
編譯測試程序:
g++ -o gtest_sum gtest_sum.cpp -I${HOME}/gtest/gtest-build/_install/include \
-L${HOME}/gtest/gtest-build/_install/lib -lgtest_main -lgtest -lpthread -std=c++11
編譯完成後將會產出一個gtest_sum的可執行文件。
執行:
./gtest_sum
Running main() from /home/sven/work/3rd/googletest/googletest/src/gtest_main.cc
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from sum
[ RUN ] sum.testSum
[ OK ] sum.testSum (0 ms)
[----------] 1 test from sum (0 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[ PASSED ] 1 test.
4. Gtest庫的作用
經過以上流程我們已經對gtest的使用有了一些感知。並且通過編譯源碼庫會得到相關的庫文件:
- libgtest.a
- libgtest_main.a
- libgmock.a
- libgmock_main.a
那麼他們之間有什麼聯繫和區別呢。
gtest是googletest基礎測試 框架,在進行單元測試必須創建實例對象及具體行爲。 這樣在實際情況下可能不需要這樣做,
某些情況下只需要模擬構建一個虛假的實例即可驗證程序的邏輯性。這樣將引入了gmock測試框架,它依賴於gtest。
一個mock對象實現與一個真實對象相同的接口,並且可以在運行時進行指定預期的值具有很大的靈活性。
gtest_main和gmock_main可以讓測試者無需在爲每次測試用例寫入main函數。
下一章節我們將介紹Gtest中常用的宏的基本用法,如EXPECT_*和ASSERT_*等;