C++ 测试框架 GoogleTest 初学者入门篇 乙

yizhihongxing

*以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/aFeiOGO-N9O7Ab_8KJ2wxw

C++ 测试框架 GoogleTest 初学者入门篇 乙

开发者虽然主要负责工程里的开发任务,但是每个开发完毕的功能都是需要开发者自测通过的,所以经常会听到开发者提起单元测试的话题。那么今天我就带大伙一起来看看大名鼎鼎的谷歌 C++ 测试框架 GoogleTest.

本文上接《C++ 测试框架 GoogleTest 初学者入门篇 甲》,欢迎关注微信公众号【ENG八戒】查看更多精彩内容。

搜索框传播样式-标准色版.png


安装配置环境

Googletest 的安装配置过程并不复杂,但是对于小白来说还是有些困难,所以很有必要手把手说一下。

为了更清晰地说明环境配置过程,下面会选择对 Googletest 源码执行编译,然后安装。编译源码时,Googletest 官方手册推荐使用的工具有两种,这里只介绍其中的 Cmake。

其实在各个平台,用户都有使用 Googletest 的需求,这里专挑 Linux 和 Windows 平台来分别说明怎么安装配置 Googletest。

linux 平台

我的虚拟机里 Linux 系统是 Ubuntu 18.04,使用 apt 在线直接安装的 cmake 版本最高只能去到 3.10,为了顺利编译最新版的 Googletest 源码,选择安装官网最新版的 cmake。

安装最新版 cmake

先卸载原来的 cmake 版本,再添加指定安装源为 kitware.com 并更新安装缓冲,最后开始安装,下面的指令可依次操作

# 卸载 cmake
sudo apt purge --auto-remove cmake

# 下载 cmake 安装包,
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null

sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main'

sudo apt update

sudo apt install cmake

下载编译 gtest 开发包

下载安装源码包

sudo apt-get install libgtest-dev

进入源码安装目录,执行编译

cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make

编译完之后,我看到网上有些教程会推荐直接拷贝库文件(.a)到 /usr/lib 目录

sudo cp *.a /usr/lib

不过,我建议是直接用 install 命令,这样库文件和头文件都可以一步部署到位

sudo make install

好了,到这里 ubuntu 下面的 googletest 就安装结束了,你也可用之前的应用样例来验证一下环境是否 OK 。

Windows 平台

在 Windows 平台安装最新版 cmake 比较简单,这里掠过。

我这里安装的版本是

cmake version 3.24.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).

下载编译 googletest 源码包

这里选择 googletest 的最新稳定版源码包,可以去 github 下载,下面贴出我这边实验用的下载链接

https://codeload.github.com/google/googletest/zip/refs/tags/v1.13.0

下载之后解压到本地文件夹,进到这个本地文件夹,然后启动命令行终端 cmd,当前位置应该是这个本地文件夹,接着按照下面的指令去编译,默认输出静态的调试版本库文件(.lib)

mkdir build && cd build
cmake ..
cmake --build .

编译成功后,在目录 .\build\lib\Debug 下面多了很多生成文件,但是我们只需要这两个静态库文件

gtest.lib
gtest_main.lib

那么,怎么输出动态的调试版本库文件(.lib)呢?

C++ 测试框架 GoogleTest 初学者入门篇 乙

按照上图修改保存,然后输入和上面一样的编译指令即可。

编译成功后,在目录 .\build\bin\Debug 下面多了很多生成文件,但是我们只要这两个动态库文件

gtest.dll
gtest_main.dll

另外,和编译静态库文件一样,在目录 .\build\lib\Debug 下生成的这两个静态库文件也是需要的,用于链接目标 exe 文件。

gtest.dll
gtest_main.dll

测试工程配置示例

新建一个测试工程 TEST,调用 googletest 库分为静态调用和动态调用,分别对应上一节的两种输出文件,现在就分开来演示一下怎么配置目标测试工程。

TEST 工程只有一个源码文件 main.cpp

调用静态调试库

首先,需要找到 googletest 的源码目录下的 .\googletest\include\gtest

C++ 测试框架 GoogleTest 初学者入门篇 乙

把整个文件夹拷贝到目标测试工程 TEST 目录下,然后把 gtest 编译输出的静态库文件(.lib)也拷贝到目标测试工程 TEST 的 .\gtest\lib 目录下

C++ 测试框架 GoogleTest 初学者入门篇 乙

然后看一下 CMakeLists.txt 可以这样写

cmake_minimum_required(VERSION 2.14)

project(runTests)

# Locate GTest
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
message("CMAKE_CURRENT_SOURCE_DIR:" ${CMAKE_CURRENT_SOURCE_DIR})

link_directories(${CMAKE_CURRENT_SOURCE_DIR}/gtest/lib)

# for window static debug
set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
# for window dynamic debug
# set(CMAKE_CXX_FLAGS_DEBUG "/MDd")
# for window dynamic release
# set(CMAKE_CXX_FLAGS_DEBUG "/MD")
# for window static release
# set(CMAKE_CXX_FLAGS_DEBUG "/MT")

# Link runTests with what we want to test and the GTest and pthread library
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME}
                        gtest
                        gtest_main)

Cmake 工程的编译方法都是一样的,照搬上面提到的编译指令即可,这里略过

调用动态调试库

配置过程,和调用静态调试库是差不多的,但是在把 gtest 编译输出的静态库文件(.lib)拷贝到目标测试工程 TEST 的 .\gtest\lib 目录下时,也需要把 gtest 编译输出的动态库文件(.dll)一起拷贝到目标测试工程 TEST 的 .\gtest\lib 目录下,这样的目的是为了在测试工程 TEST 编译的过程中,方便部署可执行文件(.exe)的运行环境,也就是 exe 文件依赖的 googletest 库文件。

然后看一下 CMakeLists.txt 可以这样写

# for default window dynamic debug
cmake_minimum_required(VERSION 2.14)

project(runTests)

set(DESTINATION_DIR ${PROJECT_BINARY_DIR}/Debug)
execute_process( COMMAND ${CMAKE_COMMAND} -E make_directory ${DESTINATION_DIR})
execute_process( COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/gtest/lib/gtest_main.dll ${DESTINATION_DIR})
execute_process( COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/gtest/lib/gtest.dll ${DESTINATION_DIR})

# Locate GTest
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
message("CMAKE_CURRENT_SOURCE_DIR:" ${CMAKE_CURRENT_SOURCE_DIR})

link_directories(${CMAKE_CURRENT_SOURCE_DIR}/gtest/lib)

# Link runTests with what we want to test and the GTest and pthread library
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME}
                        gtest
                        gtest_main)

在 cmake 运行过程中,会把 exe 文件依赖的 googletest 库文件(.dll)拷贝到即将生成的 exe 文件的存放位置。


由于篇幅受限,本系列教程还未完结,下一篇《C++ 测试框架 GoogleTest 初学者入门篇 丙》将在本公众号稍后推送,如果你想看了解更多精彩内容,欢迎关注我的微信公众号 【ENG八戒】

学习可以等,时间不等人!

关注我,带你学习编程领域更多核心技能!

搜索框传播样式-标准色版.png

原文链接:https://www.cnblogs.com/englyf/p/17289327.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 测试框架 GoogleTest 初学者入门篇 乙 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • luogu_P1040 [NOIP2003 提高组] 加分二叉树

    P1040 [NOIP2003 提高组] 加分二叉树 – 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意:给你一颗中序遍历为1到n的二叉树,和每个节点的val。树的值=左子树的值×右子树的值+根的val,空树值为1,求整个树最大值和这个值树的前序遍历。 题解:区间dp。dp[l][r]表示最大值,root[l][r]表示最大值的根,枚举区…

    C++ 2023年4月27日
    00
  • C++重载的奥义之运算符重载

    0、引言         重载,顾名思义从字面上理解就是重复装载,打一个不恰当的比方,你可以用一个篮子装蔬菜,也可以装水果或者其它,使用的是同一个篮子,但是可以用篮子重复装载的东西不一样。         正如在之前的文章《重载的奥义之函数重载》中介绍的类似,函数的重载是指利用相同的函数名设计一系列功能相近,但是功能细节不一样的函数接口;因此运算符重载也是指…

    C++ 2023年4月18日
    00
  • 第四部分:Spdlog日志库的核心组件分析-logger

    Spdlog是一个快速且可扩展的C++日志库,它支持多线程和异步日志记录。在本文中,我们将分析Spdlog日志库的核心代码,探究其实现原理和代码结构。 Spdlog的基本架构 上一篇文章介绍了spdlog的五个主要组件,其中最重要是Logger、Sink和Formatter其中,Logger负责日志的记录和管理,Sink负责将日志输出到不同的目标(比如控制台…

    C++ 2023年4月18日
    00
  • <五>move移动语义和forward类型转发

    move : 移动语义,得到右值类型forward:类型转发,能够识别左值和右值类型 只有两种形式的引用,左值引用和右值引用,万能引用不是一种引用类型,它存在于模板的引用折叠情况,但是能够接受左值和右值区分左值和右值得一个简单方式就是能不能取地址一个右值一旦有名字那么就变成了左值 #include <iostream> using namespa…

    C++ 2023年5月4日
    00
  • 创建一个简单的Qt工程

    1.打开QtCreator进行如下选择。(开软去官网下载即可,注册邮箱可以断网跳过) 第一步: 选择Application     第二步:这里文件名称和路径都不要有中文 第三步:选择编译模式 点击下一步 第四步:选择 Widget点击下一步   第五步:运行工程,判断是否创建成功 课堂小记: 1.析构函数不能被重载 2.被protect关键字修饰的成员变量…

    C++ 2023年5月7日
    00
  • 驱动开发:通过MDL映射实现多次通信

    在前几篇文章中LyShark通过多种方式实现了驱动程序与应用层之间的通信,这其中就包括了通过运用SystemBuf缓冲区通信,运用ReadFile读写通信,运用PIPE管道通信,以及运用ASYNC反向通信,这些通信方式在应对一收一发模式的时候效率极高,但往往我们需要实现一次性吐出多种数据,例如ARK工具中当我们枚举内核模块时,往往应用层例程中可以返回几条甚至…

    C++ 2023年4月30日
    00
  • 记一次 腾讯会议 的意外崩溃分析

    一:背景 1. 讲故事 前段时间在用 腾讯会议 直播的时候,居然意外崩溃了,还好不是在训练营上课,不然又得重录了,崩完之后发现 腾讯会议 的 bugreport 组件会自动生成一个 minidump,截图如下: 作为一个.NET高级调试的技术博主,非 .NET 的程序也得要研究研究哈???,有了这个好奇心,也有了这个 dump,接下来用 windbg 看一看…

    C++ 2023年4月22日
    00
  • Python:界面开发,wx入门篇

    以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「englyf」https://mp.weixin.qq.com/s/3Yb_YAKiMte_f5HanetXiA 本文大概 3617 个字,阅读需花 10 分钟 内容不多,但也花了一些精力 如要交流,欢迎评论区留言 谢谢你的点赞收藏分享 如果你接触过桌面 GUI 软件开发,那么你一定会对 MF…

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部