简介
GoogleTest 简称 gtest,是 Google 公司推出的开源的 C++ 测试框架,提供了非常多的工具来支持 C++ 代码的单元测试。
GitHub:https://github.com/google/googletest
文档:https://google.github.io/googletest/
配置
目录结构
以之前的计算 demo 为例,我们来改造一下,以增加测试的能力。
- 增加 dependencies 目录,用于存放 gtest 源码
- 增加 test 目录,用于存放测试用例
func/
- calc.h
- calc.cpp
- CMakeLists.txt
dependencies/
- googletest/
test/
- test_calc.cpp
- CMakeLists.txt
main.cpp
CMakeLists.txt
下载 gtest
在 dependencies 目录下,执行:
> git clone https://github.com/google/googletest
或者直接下载 release 版本的压缩包,并解压:
> wget "https://github.com/google/googletest/archive/refs/tags/v1.14.0.tar.gz"
> tar zxvf googletest-1.14.0.tar.gz
> mv googletest-1.14.0 googletest
CMake 配置
开启开关,并添加 test 目录
# test
enable_testing()
add_subdirectory(test)
设置项目根目录
set(demo_root {{CMAKE_CURRENT_SOURCE_DIR})
添加 gtest 目录
add_subdirectory({{demo_root}/dependencies/googletest googletest)
生成测试程序
add_executable(test_calc ./test_calc.cpp)
target_include_directories(test_calc PUBLIC {{demo_root}/dependencies/googletest/include)
target_include_directories(test_calc PUBLIC {{demo_root})
target_link_libraries(test_calc PUBLIC calc gtest gtest_main)
添加测试用例
add_test(NAME test_calc COMMAND test_calc)
完整配置
CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
project(Demo)
set(demo_root {{CMAKE_CURRENT_SOURCE_DIR})
set(target_name demo)
set(library_name calc)
file(GLOB header_files *.h *.hpp)
file(GLOB src_files *.cpp)
include_directories(func)
link_directories(func)
add_executable({{target_name} {{src_files})
target_link_libraries({{target_name} {{library_name})
add_subdirectory(func)
# test
enable_testing()
add_subdirectory(test)
test/CMakeListst.txt
cmake_minimum_required(VERSION 3.0)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
project(DemoTest)
add_subdirectory({{demo_root}/dependencies/googletest googletest)
add_executable(test_calc ./test_calc.cpp)
target_include_directories(test_calc PUBLIC {{demo_root}/dependencies/googletest/include)
target_include_directories(test_calc PUBLIC {{demo_root})
target_link_libraries(test_calc PUBLIC calc gtest gtest_main)
add_test(NAME test_calc COMMAND test_calc)
构建
在程序目录下新建一个 build 目录,在该目录下进行构建
> mkdir build
> cd build
> cmake ..
> make
构建完成,除了 calc 动态库和 main 可执行程序外,还会生成 gtest 库,以及我们的测试用例的可执行程序
main
func/libcalc.so
test/googletest
test/test_calc
测试
测试用例
test_cacl.cpp
#include "calc.h"
#include <gtest/gtest.h>
TEST(Calc, Add)
{
Calc<int> c;
EXPECT_EQ(3, c.Add(1, 2));
}
我们创建了一条测试用例,通过 gtest 提供的 TEST 宏进行测试,并通过 EXPECT_EQ 宏对结果进行比对。
执行测试
执行测试的方式有三种:
- 直接运行生成的测试程序进行测试
- 通过 CMake 提供的 ctest 命令进行测试
- 通过 make 提供的 make test 命令进行测试
- 要使用后两种方式,前提条件是要在 CMakeLists.txt 中开启测试和添加测试用例:
- enable_testing()
- add_test(NAME test_calc COMMAND test_calc)
运行测试程序
> ./test_calc
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from Calc
[ RUN ] Calc.Add
[ OK ] Calc.Add (0 ms)
[----------] 1 test from Calc (0 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[ PASSED ] 1 test.
ctest
> ctest
Test project demo/build
Start 1: test_calc
1/1 Test #1: test_calc ........................ Passed 0.03 sec
100% tests passed, 0 tests failed out of 1
Total Test time (real) = 0.03 sec
make test
> make test
Running tests...
Test project demo/build
Start 1: test_calc
1/1 Test #1: test_calc ........................ Passed 0.02 sec
100% tests passed, 0 tests failed out of 1
Total Test time (real) = 0.03 sec
总结
通过集成GoogleTest,我们为C++代码增加了单元测试的功能。