赞
踩
https://download.csdn.net/download/u011775793/88601877
单元测试是一种软件测试方法,用于测试代码中的最小可测试单元。在软件开发中,我们通常将代码分解为多个模块或类,每个模块或类都有自己的功能和行为。单元测试的目的是确保每个模块或类都能正常工作,不会影响其他模块或类的功能。
gtest是Google开发的C++单元测试框架,它基于C++标准库,提供了丰富的测试功能和易于使用的API。gtest可以自动发现测试用例,支持多种测试模式和断言,可以帮助我们更轻松地进行单元测试。
GitHub - google/googletest: GoogleTest - Google Testing and Mocking Framework
google/googletest: GoogleTest - Google Testing and Mocking Framework (github.com)
oss-policies-info/foundational-cxx-support-matrix.md at main · google/oss-policies-info (github.com)
GoogleTest User’s Guide | GoogleTest
gtest已经包含在Google Test的发布包中,可以直接下载并使用。如果你使用的是Linux系统,可以通过以下命令安装:
sudo apt-get install libgtest-dev
如果你使用的是Windows系统,可以从gtest官网下载源代码,然后CMake+MSVC构建和安装gtest。
https://github.com/google/googletest/releases/ 下载最新版本源代码。
https://github.com/google/googletest/releases/
解压源代码到 “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”将会生成对应的头文件和库目录:
Quickstart: Building with CMake | GoogleTest
创建目录“D:\my_tutorials\SourceCode\gtest_lessions”。
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:
- #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);
- }
- 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
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++项目。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。