Google Mock 和 Google Test编写单元测试入门(环境配置、简单执行)

news2024/11/16 17:38:27

文章目录

  • 环境的配置
      • 方法1:从源代码构建
        • 第一步:克隆库的源代码
        • 第二步:构建库
      • 方法 2:使用 CMake 的 `FetchContent`
        • 示例 CMakeLists.txt
  • 项目的创建
      • 项目结构
      • CMakeLists.txt (根目录)
      • main.cpp (示例程序)
      • tests/CMakeLists.txt (测试部分)
      • tests/MyClassTest.cpp (示例测试)
      • 终端命令
      • 添加一个测试用例
      • 注意事项

环境的配置

Google Mock 和 Google Test环境配置

方法1:从源代码构建

第一步:克隆库的源代码

你可以使用 git 来克隆 gTest 和 gMock 的代码:

git clone https://github.com/google/googletest.git
第二步:构建库
  1. 进入 googletest 目录:

    cd googletest
    
  2. 创建构建目录并构建:

    mkdir build
    cd build
    cmake ..
    make
    
  3. 安装:

    如果你希望将库安装到系统目录,可以使用:

    sudo make install
    

要安装 Google Mock(gMock)和 Google Test(gTest)库,你可以通过几种方法进行,下面将介绍常用的两种方法:使用包管理器和从源代码构建。

方法 2:使用 CMake 的 FetchContent

如果不想手动安装库,可以在 CMake 项目的 CMakeLists.txt 中使用 FetchContent 来自动下载并构建 gTest 和 gMock。

示例 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyGMockProject)

set(CMAKE_CXX_STANDARD 11)

include(FetchContent)

# Fetch GoogleTest
FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG release-1.11.0  # 选择合适的版本
)

FetchContent_MakeAvailable(googletest)

# 添加源文件
set(SOURCE_FILES main.cpp MyClass.cpp)
set(TEST_FILES MyClassTest.cpp)

# 创建可执行文件
add_executable(MyExecutable ${SOURCE_FILES})

# 创建测试可执行文件
add_executable(MyTests ${TEST_FILES})

# 链接 gMock 和 gTest
target_link_libraries(MyTests gmock gtest gmock_main gtest_main)

项目的创建

在 Visual Studio Code (VSCode) 中使用 Google Mock 和 Google Test 的完整流程如下:

项目结构

创建一个新的文件夹。然后在该文件夹中创建以下结构:

MyGTestProject/
├── CMakeLists.txt
├── main.cpp
└── tests/
    ├── CMakeLists.txt
    └── MyClassTest.cpp

CMakeLists.txt (根目录)

MyGTestProject/CMakeLists.txt 中添加以下内容:
使用方法二配置环境

cmake_minimum_required(VERSION 3.10)
project(MyGTestProject)

set(CMAKE_CXX_STANDARD 11)

# Fetch Google Test
include(FetchContent)
FetchContent_Declare(
    googletest
    GIT_REPOSITORY https://github.com/google/googletest.git
    GIT_TAG release-1.11.0  # 最后用于 1.11.0,或选择任意合适版本
)

FetchContent_MakeAvailable(googletest)

# 添加主程序文件
add_executable(MyExecutable main.cpp)

# 添加测试子目录
add_subdirectory(tests)

main.cpp (示例程序)

MyGTestProject/main.cpp 中添加以下代码:

#include <iostream>

int main() {
    std::cout << "Hello, Google Test!" << std::endl;
    return 0;
}

tests/CMakeLists.txt (测试部分)

MyGTestProject/tests/CMakeLists.txt 中添加以下内容:

# 添加测试源文件
set(TEST_FILES MyClassTest.cpp)

# 创建测试可执行文件
add_executable(MyTests ${TEST_FILES})

# 链接 GTest 和 GMock
target_link_libraries(MyTests gmock gtest gmock_main gtest_main)

# 启用测试
enable_testing()
add_test(NAME MyTests COMMAND MyTests)

tests/MyClassTest.cpp (示例测试)

MyGTestProject/tests/MyClassTest.cpp 中添加以下测试代码:

#include <gmock/gmock.h>
#include <gtest/gtest.h>

TEST(SampleTest, SampleAssertion) {
    ASSERT_EQ(1 + 1, 2);
}

终端命令

命令:

cd MyGTestProject
mkdir build
cd build
cmake ..
make
# 运行可执行文件
./MyExecutable
# 运行测试可执行文件
./tests/MyTests

添加一个测试用例

在源码中修改:

#include <gmock/gmock.h>
#include <gtest/gtest.h>

TEST(SampleTest, SampleAssertion) {
    ASSERT_EQ(1 + 1, 2);
}

TEST(SampleTest, SampleAssertion1) {
    ASSERT_EQ(1 + 1, 2);
}

注意TEST中两个参数不能全部都相同,会报错。

TEST()参数从一般到具体。
第一个参数是测试套件(test suite)的名称;
第二个参数是测试套件(test suite)中的测试名称;
这两个名称都必须是有效的C++标识符,并且不应包含任何下划线(_)。

测试的全名由其包含的测试套件及其测试名称组成。来自不同的测试套件的测试可以具有相同的测试名称。

运行结果:

在这里插入图片描述

注意事项

  1. 确保编译器和 CMake 版本兼容
  2. 如果遇到问题,可以查看 VSCode 的输出窗口,了解 CMake 和构建的详细信息。
  3. 可以添加更多的测试文件,只需在 tests/CMakeLists.txt 中添加这些文件的名称。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1993527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

更换CentOS中docker的镜像源

如果docker pull镜像出现&#xff1a; error pulling image configuration: download failed after attempts6: dial tcp 173.236.182.137:443: i/o timeout 如果是阿里云&#xff0c;我们进入阿里云官网&#xff1a; 阿里云开发者社区-云计算社区-阿里云 然后点击产品&#…

医疗器械重大网络安全更新是什么?有何价值?

医疗器械重大网络安全更新是指那些影响到医疗器械的安全性或有效性的网络安全更新。这类更新通常涉及重大网络安全功能的变更&#xff0c;旨在提升医疗器械在网络环境中的安全性和稳定性。 一、医疗器械重大网络安全更新的价值 保障患者安全&#xff1a;医疗器械在处理患者数据…

开发学习日记1

用这个系列博客记录下学习开发的一些小收获 git的使用&#xff1a; 说来惭愧&#xff0c;学到了大二&#xff0c;git的使用还是一团糟&#xff0c;记录一下如何使用git进行团队合作开发 当要加入其他人的项目时首先你要创建自己的分支&#xff08;克隆一下其他分支&#xff…

处理Pandas中的JSON数据:从字符串到结构化分析

在数据科学领域&#xff0c;JSON作为一种灵活的数据交换格式&#xff0c;被广泛应用于存储和传输数据。然而&#xff0c;JSON数据的非结构化特性在进行数据分析时可能会带来一些挑战。本文将指导读者如何使用Pandas库将DataFrame中的JSON字符串列转换为结构化的表格数据&#x…

mac 容器化 安装docker es | redis

brew install docker 安装桌面版 docker-destop 在桌面端搜索对应的es 版本 docker 安装elasticsearch 先确保java 已安装 oracle-jdk17 LTS 版本 报错&#xff1a;ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] li…

【esp32】secure boot (安全启动)配置

简介 Secure Boot&#xff0c;即安全启动&#xff0c;是一种确保在一个平台上运行的程序的完整性的过程或机制。它的主要作用是在固件和应用程序之间建立一种信任关系&#xff0c;从而保护操作系统免受恶意攻击。 工作原理 签名验证&#xff1a;Secure Boot使用公钥/私钥对来…

【0304】psql 执行“VACUUM FULL”命令的背后实现过程

1. 概述 在前面讲解Postgres内核中解析器相关(【0297】Postgres内核之 INSERT INTO 原始解析树 转 Query 树 (1))内容时,曾提到过,Postgres内核大致将用户下发的SQL语句分为三大类,这里的VACUUM FULL属于CMD_UTILITY; 因此直接调用utility.c(实用程序)中的对应函数。…

javaEE(2)

一. 过滤器 作用:拦截web服务器向后端发送的数据,使请求地址在到达servlet之前进入到指定的过滤器中,可以对数据进行一些统一的处理,比如设置编码,权限控制等 使用:创建一个类实现Filter接口,并实现里面的doFilter()方法,过滤器要做的作用主要写在doFilter方法中 public clas…

实训日记day24

python基础 环境部署 [root2 ~]# yum list installed|grep python python-libs.x86_64 2.7.5-68.el7 [root2 ~]# yum -y install epel-release #必须要有epel库 [root2 ~]# yum update #更新yum [root2 ~]# yum -y install net-tools [root2 ~]…

Spring Boot 多种方式更改上下文路径

1. spring boot上下文路径概述 默认情况下&#xff0c;Spring Boot 在根上下文路径&#xff08;“/”&#xff09;上提供内容。 尽管通常最好采用约定而不是配置&#xff0c;但有时我们确实希望拥有自定义路径。 在此快速教程中&#xff0c;我们将介绍配置它的不同方法。 2…

Gitlab-CI

官网 ## gitlab-ci 完整语法 https://docs.gitlab.cn/jh/ci/yaml/index.html 原理 流程图 说明 GitLab Runner 是 GitLab CI/CD 的一个组件&#xff0c;用于运行构建、测试和部署作业。它是一个开源项目&#xff0c;允许您在专用、共享或云计算资源上执行作业。 GitLab Run…

保姆级教程,一文了解LVS

目录 一.什么是LVS tips: 二.优点&#xff08;为什么要用LVS&#xff1f;&#xff09; 三.作用 四.程序组成 五.LVS 负载均衡集群的类型 六.分布式内容 六.一.分布式存储 六.二.分布式计算 六.三.分布式常见应用 tips&#xff1a; 七.LVS 涉及相关的术语 八.LVS 负…

轻舟智问大语言模型算法分析报告

一、算法全周期行为分析 1. 算法安全 信息内容安全&#xff1a;通过输入输出内容风控处理&#xff0c;确保生成的内容不涉及违法或不当信息。 信息源安全&#xff1a;模型支持用户挂载知识内容进行增强&#xff0c;确保使用高质量的知识来源。 2. 算法监测 信息安全监测&#x…

day23(mysql主从脚本与mysql详细语句介绍)

一、mysql主从脚本 在同步时&#xff0c;对删除和修改都比较慎重&#xff08;监控同步时&#xff09; mysql主从搭建 前提软件libaio&#xff0c;rsync 1.主 2.从 3.同步 4.测试 注意&#xff1a;先执行从服务器的脚本&#xff0c;再执行主服务器脚本 master-mysql配置…

Vue3+setup使用vuemap/vue-amap实现地图相关操作

首先要下载依赖并且引入 npm安装 // 安装核心库 npm install vuemap/vue-amap --save// 安装loca库 npm install vuemap/vue-amap-loca --save// 安装扩展库 npm install vuemap/vue-amap-extra --save cdn <script src"https://cdn.jsdelivr.net/npm/vuemap/vue-a…

ArcGIS基础:自定义创建点线面等样式符号以方便使用

有时&#xff0c;使用ArcGIS自带的符号样式库无法满足我们使用要求&#xff0c;还需要进行调整&#xff0c;可能会浪费一些时间&#xff0c;那么自己新建一些样式符号备用&#xff0c; 需要的时候直接使用&#xff0c;会节省很多时间&#xff0c;大家学会之后&#xff0c;对学…

ctfshow-web入门-sql注入(web196-web200)堆叠注入

目录 1、web196 2、web197 3、web198 4、web199 5、web200 1、web196 对输入长度做了限制 输出 flag 的条件&#xff1a; if($row[0]$password){$ret[msg]"登陆成功 flag is $flag";} 其中 $row[0] 表示从数据库查询结果中提取的某一行的第一个字段值&#x…

Linux网络编程5

IO多路复用 1.IO模型 在unix/linu下主要有四种I/O模式&#xff1a; 阻塞I/O: 最常用 大部分程序使用的都是阻塞模式的I/O 阻塞I/O 缺省情况下&#xff0c;套接字建立后所处于的模式就是阻塞I/O模式 读操作&#xff1a;read,recv,recvfrom 写操作&#xff1a;write,send …

【最新】推荐7款智能AI写作论文生成网站工具

在当前的AI技术浪潮中&#xff0c;智能AI写作工具已经成为了学术研究和论文撰写的重要助手。本文将推荐7款高效且功能全面的智能AI写作论文生成网站工具&#xff0c;并重点介绍其中备受好评的千笔-AIPassPaPer。 1. 千笔-AIPassPaPer 千笔-AIPassPaPer是一款集多种功能于一体…

最近在写的支付模块

最近再写支付模块就到处借鉴 旨在回顾一下。 1.确认订单功能 使用场景是&#xff1a;用户在选择好购物车后&#xff0c;或者是直接选择商品后&#xff08;选择商品封装为购物车&#xff09; 这样做是根据尚硅谷来学习的 目前需要这些属性&#xff0c;原因是在确认订单页面后…