官网:https://google.github.io/googletest/
Quickstart cmake: https://google.github.io/googletest/quickstart-cmake.html
推荐从primer文档开始:https://google.github.io/googletest/primer.html
Samples: https://google.github.io/googletest/samples.html
忍不住吐槽下,google test的文档不太给力。
基本概念
主要就是断言 assertions
两类断言:
ASSERT_* 遇到错误会停止;EXPECT_* 遇到错误会继续;
VS+gtest
以官网sample1为例。
新建一个静态库项目,把sample1.h, sample1.cpp扔进去,编译生成sample1.lib.
不需要手动从github上下载gtest文件,新建Google Test工程时vs会自动把gtest库放在解决方案下的packages文件夹里。
选择要测试的项目sample1,vs会把它放到googletest工程的引用项里。
记着手动添加一下sample1项目的include目录。
在默认的test.cpp里加上sample1_unittest.cpp的代码,运行即可。
cmake+gtest
一般不会按照Quickstart那样用FetchContent_Declare把gtest源码down下来,而是提前下载下来。
在googletest目录下编译:
cmake -S . -B build
cd build && make && sudo make install
头文件安装到了/usr/local/include/gtest/ 。
库文件在 /usr/local/lib/ 下, 它们分别是: libgtest.a 和 libgtest_main.a
然后以googletest提供的sample1为例。
直接编译,依赖库有libgtest_main.a和pthread:
g++ sample1_unittest.cc sample1.cc -lgtest -lgtest_main -lpthread -o sample1_unittest
执行sample1_unittest就可以了。
或者在sample1_unittest.cc里加上gtest_main.cc 提供的main:
// Step 3. Call RUN_ALL_TESTS() in main().
//
// We do this by linking in src/gtest_main.cc file, which consists of
// a main() function which calls RUN_ALL_TESTS() for us.
//
// This runs all the tests you've defined, prints the result, and
// returns 0 if successful, or 1 otherwise.
//
// Did you notice that we didn't register the tests? The
// RUN_ALL_TESTS() macro magically knows about all the tests we
// defined. Isn't this convenient?
GTEST_API_ int main(int argc, char **argv) {
printf("Running main() from %s\n", __FILE__);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
如果调用了main,就不需要链接gtest_main了:
g++ sample1_unittest.cc sample1.cc -lgtest -lpthread -o sample1_unittest
但如果工程再大一些,用上了cmake,那就需要根据目录好好谢谢cmakelists了。
以下是我的目录树:
$ tree samples
samples
├── build
├── CMakeLists.txt
├── include
│ └── sample1.h
├── main.cc
└── src
└── sample1
├── CMakeLists.txt
├── sample1.cc
└── sample1_unittest.cc
/samples/CMakeLists.txt:
cmake_minimum_required(VERSION 3.14)
project(sample1)
# GoogleTest requires at least C++11
set(CMAKE_CXX_STANDARD 11)
MESSAGE(STATUS "Binary dir:" ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "Source dir:" ${PROJECT_SOURCE_DIR})
add_subdirectory(src/sample1)
# 开启测试
enable_testing()
# 添加到测试
add_test(NAME test_sample1 COMMAND ${PROJECT_BINARY_DIR}/src/sample1/sample1_unittest)
/samples/src/sample1/CMakeLists.txt:
set(LIB_STATIC_SRC sample1.cc)
set(LIB_STATIC_NAME static)
add_library(${LIB_STATIC_NAME} STATIC ${LIB_STATIC_SRC})
set_target_properties(${LIB_STATIC_NAME} PROPERTIES OUTPUT_NAME "sample1")
# 查找 GTest 库
find_package(GTest REQUIRED)
# GTest 的头文件
include_directories(${GTEST_INCLUDE_DIRS})
# 包含头文件
include_directories(${PROJECT_SOURCE_DIR}/include)
# 在build/src/sample1里搜索libsample1.a
link_directories(${PROJECT_BINARY_DIR}/src/sample1)
# 单元测试可执行文件
add_executable(sample1_unittest sample1_unittest.cc)
# 链接测试库
target_link_libraries( sample1_unittest
${GTEST_BOTH_LIBRARIES} # google test 的两个库, 相当于下面两句
# gtest_main -lgtest -lgtest_main -lpthread # 提供main, sample1_unittest里可以没有main
# gtest # 不提供main, sample1_unittest里要实现main
pthread # 依赖 pthread 库
sample1 # 还有目标库
)
编译:
mkdir build && cd build
cmake .. && make && make test
注意add_test必须放到根目录的CMakeLists.txt里,这样执行make test才能发现有效的测试目标。
Google Mock
https://google.github.io/googletest/gmock_for_dummies.html
另外还有GoogleTest配套的测试库Google Mock,文档说类似java中也有jMock,可以对类(或者说虚类,接口类)进行测试。
GoogleTest也可以测试类,但靠真实对象进行测试不太讲究。
|