Cmake C++开发 windows 下 googletest 模板项目教程搭建

        首先有了之前CMake VS code C++ 开发环境搭建后,这节教程详细讲解,怎么让自己的项目集成googletest 模块。好方便自己进行功能自测。我们都知道项目周期过程中,测试占用很重要的一个环节。 
        项目开发和自测试之间存在密切的关系。自测试是项目开发中的一个重要环节,旨在确保开发的软件或系统在功能和质量方面达到预期的标准。
自测试通常包括以下几个方面:


单元测试:针对软件的最小功能单元(如函数、方法)进行测试,以验证其行为是否符合预期。单元测试通常由开发人员编写并运行。


集成测试:在单元测试之后,将多个功能单元组合在一起进行测试,以验证它们的集成是否正常工作。集成测试可以帮助发现不同模块之间的交互问题。

        自测试的目的是及早发现和修复软件中的问题,提高软件的质量和可靠性。通过自测试,开发团队可以更好地掌握软件的状态,并及时解决潜在的缺陷和错误。
        在项目开发过程中,自测试应该与开发紧密结合,测试用例应该根据软件的需求和设计来编写,并在开发过程中逐步执行。自动化测试工具和框架googletest 也可以帮助开发团队更高。

(1)下载googletest 源码包

        下载地址:Releases · google/googletest · GitHub

        选择版本:https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip

你也可以选择其他版本进行集成。下载好,先存放好在自己的电脑磁盘里面,后面用。本教程假定,我们的模板项目集成了googletest 源码,后面会一同编译。

        接下来进行后续项目时,前提请确保CMake+gcc+ vs code 开发环境已经搭建OK.

(2)创建一个cmake 项目

创建一个项目,名称叫:gtest-demo-template-basic,新建文件 CMakeLists.txt 文件,编写内容如下:

# cmake的最小版本号,对应的还有max, 设置项目的cmake最低要求版本
cmake_minimum_required(VERSION 3.12) 

# 项目名称:倒没什么影响,但是cmake会默认设置一些变量,所以
project(gtest_demo)

# 包含GTest的库文件, 这里是个相对路径
add_subdirectory(googletest) 

# 包含的目录,这样就能用 #include <gtest/gtest.h>, 这里可以对比find_package()方法,有技巧的哦
include_directories(googletest/include) 

# 添加一个测试:名称和可执行文件
add_executable(mytests mytests.cpp) 

# 链接库文件,必须在上一句的后面,会有依赖关系的 
target_link_libraries(mytests PRIVATE gtest) 

将第一步下载准备好的 googletest源码包解压到改目录内gtest-demo-template-basic/,并且命名为 googletest

   (3) 编写测试类API

编写测试接口方法,后面你将会使用googletest 来进行对这些方法进行单元测试。

新建头文件 myfunction.h ,里面定义两个方法,一个是add,一个是sub 这两个方法很简单,但是对于满足googletest 原理已经基本够用了。

#ifndef _ADD_H
#define _ADD_H

int add(int a, int b)
{
    return a + b;
}

int sub(int a, int b)
{
    return a - b;
}
#endif
(4)编写单元测试文件cpp

有了测试目标,然后我们就可以进行测试了,测试这两个接口,编写单元测试案例相关函数。

#include <gtest/gtest.h>
#include "myfunctions.h"

TEST(myfunctions, add)
{
    GTEST_ASSERT_EQ(add(10, 22), 32);
}

TEST(myfunctions, sub)
{
    GTEST_ASSERT_EQ(sub(22,10), 12);
}


int main(int argc, char* argv[])
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

里面具体函数描述如下:

使用 Google Test(gtest)框架编写程序,用于对名为myfunctions.h中的函数进行单元测试。下面是各个函数的功能和代码段的含义:

  1. #include <gtest/gtest.h>:包含了Google Test 框架的头文件,以便在程序中使用 Google Test 的功能。

  2. #include "myfunctions.h":包含了名为myfunctions.h的头文件,该文件中应该包含了待测试的函数的声明或定义。

  3. TEST(myfunctions, add):定义一个名为myfunctions的测试套件,并在其中定义了一个名为add的测试用例。测试用例用于测试add函数的功能。

  4. GTEST_ASSERT_EQ(add(10, 22), 32):使用断言宏GTEST_ASSERT_EQ,对add(10, 22)的返回值进行断言,判断其是否等于期望值32。如果断言失败,将会输出错误信息。

  5. TEST(myfunctions, sub):定义了一个名为sub的测试用例,用于测试sub函数的功能。

  6. GTEST_ASSERT_EQ(sub(22,10), 12):使用断言宏GTEST_ASSERT_EQ,对sub(22,10)的返回值进行断言,判断其是否等于期望值12。

  7. ::testing::InitGoogleTest(&argc, argv):初始化 Google Test 框架,将命令行参数传递给框架。

  8. return RUN_ALL_TESTS():运行所有的测试用例,并返回测试结果。

        使用 Google Test 框架来测试myfunctions.h中的add和sub函数的功能是否符合预期。在测试中,使用断言来验证函数的返回值与期望值是否相等。如果所有的测试用例都通过,RUN_ALL_TESTS()将返回0,表示测试通过;否则,将返回非零值,表示测试失败。

(5)项目整体结构

(6)单元测试报告输出内容
执行编译后,成功后,再执行run 后,整个单元测试案例输出结果如下:
PS C:\Drive\gtest-demo-template-basic\build> ."C:/Drive/gtest-demo-template-basic/build/mytests.exe"
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.  
[----------] 2 tests from myfunctions
[ RUN      ] myfunctions.add
[       OK ] myfunctions.add (0 ms)  
[ RUN      ] myfunctions.sub
[       OK ] myfunctions.sub (0 ms)  
[----------] 2 tests from myfunctions (12 ms total)     

[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (51 ms total)
[  PASSED  ] 2 tests.
PS C:\D_Drive\OSS\gtest-demo-template-basic\build> 

        从报告中可以快速看出来,是否有案例测试没有通过,而且还可以对同一个函数进行多条件单元测试,定义多个测试案例。

(7)总结     
  

        这个基于CMake+googletest的测试项目模板项目后续会上传到csdn ,方便用户进行下载,配置运行。如果对于里面涉及到的依赖安装包下载有困难的小伙伴,可以在评论区留言,这边提供下载到国内的网盘进行加速。

更多推荐