[C++] 基础教程 - 如何使用google test进行单元测试

本文涉及的项目源代码

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/ 下载最新版本源代码。

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)

以下是代码的解释:

  1. cmake_minimum_required(VERSION 3.14):指定项目所需的最低CMake版本为3.14。
  2. project(gtest_lession):定义项目的名称为gtest_lession。
  3. set(CMAKE_CXX_STANDARD 14):设置C++标准为C++14。
  4. set(CMAKE_CXX_STANDARD_REQUIRED ON):要求编译器支持至少C++14标准。
  5. include(FetchContent):包含FetchContent模块,用于从GitHub下载依赖库。
  6. FetchContent_Declare(googletest URL https://codeload.github.com/google/googletest/zip/refs/tags/v1.14.0):声明要下载的依赖库googletest,并提供其下载链接。
  7. set(gtest_force_shared_crt ON CACHE BOOL "" FORCE):对于Windows系统,防止覆盖父项目(可能是另一个CMake项目)的编译器和链接器设置。
  8. 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)

新添加代码具体解释如下:

  1. enable_testing():启用测试功能,允许在构建过程中生成测试文件。
  2. add_executable(hello_test hello_test.cc):定义一个名为hello_test的可执行文件,它依赖于hello_test.cc源文件。
  3. target_link_libraries(hello_test GTest::gtest_main):将Google Test库(GTest)的gtest_main目标链接到hello_test可执行文件,以便在运行测试时使用。
  4. include(GoogleTest):包含Google Test框架的头文件,以便在CMakeLists.txt中使用Google Test相关的命令。
  5. 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++项目。

  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老狼IT工作室

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值