使用 C/C++ 開發的項目,在進行測試的時候,要麼自己寫一些簡單的例子進行測試,要麼使用第三方框架。自己寫簡單的例子對於大項目來說效率就不高,而且輸出的結果就不是很專業,不能得到一個測試報告。
所以我們有必要選擇一個比較好的測試框架來對代碼進行測試,今天要介紹的就是谷歌的測試框架 google/googletest: GoogleTest - Google Testing and Mocking Framework[1]
編譯在進行測試之前我們需要對 googletest 進行編譯,然後集成到項目中,我們先來看看怎麼編譯。
只編譯庫文件git clone https://github.com/google/googletest.gitcd googletestmkdir build && cd buildcmake ..make編譯生成的庫文件在 lib 目錄下,有了它和頭文件就可以集成到項目中使用了。
編譯samples除了編譯生成庫文件, gtest 還提供了一些例子供我們學習,上面的編譯並沒有把 samples 也一起編譯,可以通過如下命令編譯 samples
cmake .. -Dgtest_build_samples=ON編譯好的二進位文件在 googletest 文件夾下,我們執行一個 sample1_unittest 看看效果
./googletest/sample1_unittest輸出結果如下
Running main() from ~/git/googletest/googletest/src/gtest_main.cc[==========] Running 6 tests from 2 test suites.[] Global test environment set-up.[] 3 tests from FactorialTest[ RUN ] FactorialTest.Negative[ OK ] FactorialTest.Negative (0 ms)[ RUN ] FactorialTest.Zero[ OK ] FactorialTest.Zero (0 ms)[ RUN ] FactorialTest.Positive[ OK ] FactorialTest.Positive (0 ms)[] 3 tests from FactorialTest (0 ms total)
[] 3 tests from IsPrimeTest[ RUN ] IsPrimeTest.Negative[ OK ] IsPrimeTest.Negative (0 ms)[ RUN ] IsPrimeTest.Trivial[ OK ] IsPrimeTest.Trivial (0 ms)[ RUN ] IsPrimeTest.Positive[ OK ] IsPrimeTest.Positive (0 ms)[] 3 tests from IsPrimeTest (0 ms total)
[] Global test environment tear-down[==========] 6 tests from 2 test suites ran. (0 ms total)[ PASSED ] 6 tests.輸出的結果很專業,並且對於通過和不通過是有顏色區分的,這裡使用文本就看不出來了,大家可以自己嘗試一下。
集成到自己的項目中使用按照上面的步驟,我們已經編譯好了 googletest 的庫文件,現在就可以開始集成進項目中了,這裡我就新創建一個 cmake 的工程了。
創建工程mkdir test && cd testmkdir src include libstouch CMakeLists.txtcp -r googletest/googletest/include/* includecp -r build/lib/* libscd src && touch main.cpp結構創建好後,我們來看一下結構
.├── CMakeLists.txt├── include│ └── gtest│ ├── gtest-death-test.h│ ├── gtest-matchers.h│ ├── gtest-message.h│ ├── gtest-param-test.h│ ├── gtest-printers.h│ ├── gtest-spi.h│ ├── gtest-test-part.h│ ├── gtest-typed-test.h│ ├── gtest.h│ ├── gtest_pred_impl.h│ ├── gtest_prod.h│ └── internal│ ├── custom│ │ ├── README.md│ │ ├── gtest-port.h│ │ ├── gtest-printers.h│ │ └── gtest.h│ ├── gtest-death-test-internal.h│ ├── gtest-filepath.h│ ├── gtest-internal.h│ ├── gtest-param-util.h│ ├── gtest-port-arch.h│ ├── gtest-port.h│ ├── gtest-string.h│ └── gtest-type-util.h├── libs│ ├── libgmock.a│ ├── libgmock_main.a│ ├── libgtest.a│ └── libgtest_main.a└── src └── main.cpp編寫CMakeLists.txtcmake_minimum_require(VERSION 2.8.12)
project(test)
set(CMAKE_CXX_STANDARD 11)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
add_executable(test ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp)
add_library(googletest SHARED IMPORTED)
set_target_properties(googletest PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libs/libgtest.a)
target_link_libraries(test googletest)編寫測試文件#include <gtest/gtest.h>#include <iostream>
int add(int a, int b) { return a + b;}
TEST(test, add) { EXPECT_EQ(5, add(2, 3));}
int main(int argc, char *argv[]){ std::cout << "start test" << std::endl; testing::InitGoogleTest(); return RUN_ALL_TESTS();}執行mkdir build && cd buildcmake .../test執行的結果如下
start test[==========] Running 1 test from 1 test suite.[] Global test environment set-up.[] 1 test from test[ RUN ] test.add[ OK ] test.add (0 ms)[] 1 test from test (0 ms total)
[] Global test environment tear-down[==========] 1 test from 1 test suite ran. (0 ms total)[ PASSED ] 1 test.總結使用谷歌測試框架進行測試還是非常方便的。
首先我們需要編譯出 libgtest 這個庫,然後把頭文件和庫添加到項目中,這樣就可以在項目中使用了。
參考•Googletest Samples | GoogleTest[2]
References[1] google/googletest: GoogleTest - Google Testing and Mocking Framework: https://github.com/google/googletest
[2] Googletest Samples | GoogleTest: https://google.github.io/googletest/samples.html