本文涉及的项目源代码
https://download.csdn.net/download/u011775793/88601877
什么是单元测试?
单元测试是一种软件测试方法,用于测试代码中的最小可测试单元。在软件开发中,我们通常将代码分解为多个模块或类,每个模块或类都有自己的功能和行为。单元测试的目的是确保每个模块或类都能正常工作,不会影响其他模块或类的功能。
什么是google test?
gtest是Google开发的C++单元测试框架,它基于C++标准库,提供了丰富的测试功能和易于使用的API。gtest可以自动发现测试用例,支持多种测试模式和断言,可以帮助我们更轻松地进行单元测试。
GitHub - google/googletest: GoogleTest - Google Testing and Mocking Framework
gtest支持的特性
google/googletest: GoogleTest - Google Testing and Mocking Framework (github.com)
C++ Support
oss-policies-info/foundational-cxx-support-matrix.md at main · google/oss-policies-info (github.com)
用户使用手册
GoogleTest User’s Guide | GoogleTest
gtest安装
Ubuntu
gtest已经包含在Google Test的发布包中,可以直接下载并使用。如果你使用的是Linux系统,可以通过以下命令安装:
sudo apt-get install libgtest-dev
Window
如果你使用的是Windows系统,可以从gtest官网下载源代码,然后CMake+MSVC构建和安装gtest。
源代码下载
https://github.com/google/googletest/releases/ 下载最新版本源代码。
使用CMake进行编译和安装
解压源代码到 “D:\cxx_3_parties\googletest-1.14.0”,通过cmake-gui来进行设置和生成vs 2022解决方案:
点击“Finish”
CMake参数说明
build_shared_lib:
默认情况下,gtest的构建方式为静态库,这意味着gtest的代码会被编译成一个独立的静态库文件,并被链接到程序中。这种方式的优点是不需要额外的运行时库支持,但是会增加程序的大小和复杂度。
使用
build_shared_lib
参数可以将gtest的构建方式改为共享库,这意味着gtest的代码会被编译成一个动态链接库文件,而不是静态库文件。使用共享库的好处是可以减少程序的大小和复杂度,同时还可以提高程序的可移植性。
需要注意的是,使用
build_shared_lib
参数可能会影响程序的性能和可移植性,因此应该根据实际情况进行选择。如果程序需要在多个平台上运行,并且对性能有较高的要求,那么最好不要使用该参数。
gtest_force_shared_crt:
在gtest中,
gtest_force_shared_crt
是一个CMake参数,它的作用是强制将gtest的共享库与静态库链接到同一个运行时库中。
默认情况下,gtest的静态库和动态库会被分别链接到不同的运行时库中,这可能会导致一些问题,例如在Windows平台上会出现“无法加载动态库”的错误。
使用
gtest_force_shared_crt
参数可以解决这个问题,它会强制将gtest的共享库与静态库链接到同一个运行时库中,从而避免了上述问题。
需要注意的是,使用
gtest_force_shared_crt
参数可能会影响程序的性能和可移植性,因此应该根据实际情况进行选择。如果程序需要在多个平台上运行,并且对性能有较高的要求,那么最好不要使用该参数。
这里我们只需要修改“CMAKE_INSTALL_PREFIX”到“D:\CXXDeps\googletest”(注意:路径中不能包括空格,如果有空格会导致库安装失败,如果非要用有空格的目录,可以尝试在路径中添加"",比如"D:\CXXDeps\googletest")其他的保持使用默认设置即可,点击“Generate”生成vs 2022解决方案:
点击“Open Project”打开解决方案:
通过“生成->批生成...”同时构建Release版本和Debug版本:
构建成功:
在“D:\CXXDeps\googletest”将会生成对应的头文件和库目录:
如何使用 gtest 对c++ 项目进行单元测试?
CMake项目
Quickstart: Building with CMake | GoogleTest
创建项目目录,通过控制台进入该目录
创建目录“D:\my_tutorials\SourceCode\gtest_lessions”。
在项目目录中创建“CMakeLists.txt”文件
CMakeLists.txt:
cmake_minimum_required(VERSION 3.14)
project(gtest_lession)
# GoogleTest requires at least C++14
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(FetchContent)
FetchContent_Declare(
googletest
URL https://codeload.github.com/google/googletest/zip/refs/tags/v1.14.0
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
以下是代码的解释:
cmake_minimum_required(VERSION 3.14)
:指定项目所需的最低CMake版本为3.14。project(gtest_lession)
:定义项目的名称为gtest_lession。set(CMAKE_CXX_STANDARD 14)
:设置C++标准为C++14。set(CMAKE_CXX_STANDARD_REQUIRED ON)
:要求编译器支持至少C++14标准。include(FetchContent)
:包含FetchContent模块,用于从GitHub下载依赖库。FetchContent_Declare(googletest URL https://codeload.github.com/google/googletest/zip/refs/tags/v1.14.0)
:声明要下载的依赖库googletest,并提供其下载链接。set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
:对于Windows系统,防止覆盖父项目(可能是另一个CMake项目)的编译器和链接器设置。FetchContent_MakeAvailable(googletest)
:下载并将googletest库安装到本地。
备注:这里使用的是1.14版本,如果需要依赖其他版本,修改到对应的github URL就好。
在项目目录中创建一个测试文件“hello_test.cc”
hello_test.cc:
#include <gtest/gtest.h>
// Demonstrate some basic assertions.
TEST(HelloTest, BasicAssertions) {
// Expect two strings not to be equal.
EXPECT_STRNE("hello", "world");
// Expect equality.
EXPECT_EQ(7 * 6, 42);
}
配置和构建使用Google Test框架的测试项目
cmake_minimum_required(VERSION 3.14)
project(gtest_lession)
# GoogleTest requires at least C++14
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(FetchContent)
FetchContent_Declare(
googletest
URL https://codeload.github.com/google/googletest/zip/refs/tags/v1.14.0
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
enable_testing()
add_executable(
hello_test
hello_test.cc
)
target_link_libraries(
hello_test
GTest::gtest_main
)
include(GoogleTest)
gtest_discover_tests(hello_test)
新添加代码具体解释如下:
enable_testing()
:启用测试功能,允许在构建过程中生成测试文件。add_executable(hello_test hello_test.cc)
:定义一个名为hello_test
的可执行文件,它依赖于hello_test.cc
源文件。target_link_libraries(hello_test GTest::gtest_main)
:将Google Test库(GTest)的gtest_main
目标链接到hello_test
可执行文件,以便在运行测试时使用。include(GoogleTest)
:包含Google Test框架的头文件,以便在CMakeLists.txt中使用Google Test相关的命令。gtest_discover_tests(hello_test)
:自动发现并编译hello_test
目录下的所有测试用例,并将它们链接到hello_test
可执行文件。
构建和运行测试
配置项目
cmake -S . -B build
构建项目
cmake --build build
运行测试
# Windows
cd build
ctest
# Linux
cd build && ctest
VC++项目
使用VS 2022 创建一个名为“GTestDemo”的项目
创建名为“main.cpp”的文件
main.cpp:
#include<gtest/gtest.h>
int add(int a, int b) {
return a + b;
}
int sub(int a, int b) {
return a - b;
}
TEST(testCase, test0) {
EXPECT_EQ(add(2, 3), 5);
EXPECT_EQ(sub(5, 3), 2);
}
int main(int argc, char **argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
给项目添加包含目录
“VC++目录->包含目录”,添加头文件路径“D:\CXXDeps\googletest\include”。
这里添加的头文件路径为前面 “使用CMake进行编译和安装”中的生成的头文件目录:
给项目添加库文件
“链接库->输入->附加依赖项”,添加“D:\CXXDeps\googletest\lib\gtest.lib”库文件。
运行项目
修改完成,点击“确定”保存新设置,使用“Debug”模式来运行项目,结果抛出以下错误:
原因是没有更改运行库所导致。
重新打开项目属性页,通过“C/C++->代码生成”查看当前使用的运行库,默认是“多线程调试 DLL (/MDd)”,需要修改为“多线程 DLL (/MD)”:
点击“确定”保存,重新运行程序:
总结
本文介绍了google test c++ 测试框架,包括如何在windows中从源代码构建和安装gtest,以及如何在VC++项目和CMake项目使用gtest对c++功能代码进行单元测试。附件中包含了使用vs 2022构建的gtest的v1.14安装库,以及本文涉及的CMake项目和VC++项目。
版权归原作者 老狼工作室 所有, 如有侵权,请联系我们删除。