当前位置: 首页 > news >正文

在 macOS 上使用 CLion 进行 Google Test 单元测试

介绍

Google Test(GTest)是 Google 开源的 C++ 单元测试框架,它提供了简单易用的断言、测试夹具(Fixtures)和测试运行机制,使 C++ 开发者能够编写高效的单元测试。

本博客将介绍如何在 macOS 上使用 CLion 配置 Google Test 进行 C++ 单元测试,包括安装 Google Test、配置 CMakeLists.txt、编写和运行测试代码,以及如何测试类和使用测试夹具。


1. 安装 Google Test

Google Test 在 macOS 上可以使用 Homebrew 安装:

brew install googletest

安装完成后,库文件通常会存放在 /usr/local/Cellar/googletest/ 目录下(具体路径可通过 brew info googletest 查看)。


2. 创建 CLion 项目

  1. 打开 CLion,选择 New Project
  2. 选择 C++ Executable,然后点击 Create 创建一个项目。

3. 配置 CMakeLists.txt

方式 1:使用 Homebrew 安装的 Google Test

如果通过 brew install googletest 安装了 Google Test,可以这样配置 CMakeLists.txt:

配置 CMakeLists

cmake_minimum_required(VERSION 3.30)
project(MyGoogleTestProject)set(CMAKE_CXX_STANDARD 20)# 查找 Google Test
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})# 添加测试文件
add_executable(MyGoogleTestProject main.cpp)# 链接 Google Test 库
target_link_libraries(MyGoogleTestProject GTest::GTest GTest::Main pthread)# 启用测试
enable_testing()
add_test(NAME MyGoogleTestProject COMMAND MyGoogleTestProject)

方式 2:使用 Git 方式引入 Google Test

如果希望将 Google Test 作为项目的一部分,可以在 CMakeLists.txt 中手动拉取 Google Test:

cmake_minimum_required(VERSION 3.10)
project(MyGoogleTestProject)set(CMAKE_CXX_STANDARD 17)# 下载 Google Test(如果未安装)
include(FetchContent)
FetchContent_Declare(googletestURL https://github.com/google/googletest/archive/refs/heads/main.zip
)
FetchContent_MakeAvailable(googletest)# 添加测试源码文件
add_executable(my_test test.cpp)# 链接 Google Test
target_link_libraries(my_test gtest gtest_main)# 启用测试
enable_testing()

4. 编写测试代码

在项目根目录下创建 main.cpp 文件,并编写测试代码,例如:

测试代码

#include <gtest/gtest.h>// 测试函数
int Add(int nA, int nB) {return nA + nB;
}// 测试用例
TEST(AddTest, HandlesPositiveNumbers) {EXPECT_EQ(Add(2, 3), 5);
}TEST(AddTest, HandlesNegativeNumbers) {EXPECT_EQ(Add(-2, -3), -5);
}// 主函数
int main(int argc, char **argv) {::testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}

如果需要测试类的成员函数如下:

  • 创建 Calculator 类,该类提供加法和减法功能。
  • 编写 Google Test 测试。

Calculator 类的头文件:

#ifndef CALCULATOR_H
#define CALCULATOR_Hclass Calculator {
public:int Add(int nA, int nB);int Subtract(int nA, int nB);
};#endif // CALCULATOR_H

Calculator 类的源文件:

#include "Calculator.h"int Calculator::Add(int nA, int nB) {return nA + nB;
}int Calculator::Subtract(int nA, int nB) {return nA - nB;
}

为 Calculator 编写测试,创建 calculator_test.cpp 文件:

#include <gtest/gtest.h>
#include "Calculator.h"// 测试 Add 方法
TEST(CalculatorTest, HandlesAddition) {Calculator calculator;EXPECT_EQ(calculator.Add(3, 4), 7);EXPECT_EQ(calculator.Add(-2, -5), -7);EXPECT_EQ(calculator.Add(10, -5), 5);
}// 测试 Subtract 方法
TEST(CalculatorTest, HandlesSubtraction) {Calculator calculator;EXPECT_EQ(calculator.Subtract(10, 3), 7);EXPECT_EQ(calculator.Subtract(5, 8), -3);EXPECT_EQ(calculator.Subtract(-5, -10), 5);
}

测试类的成员函数的结果:

测试类的结果


5. 运行 Google Test

方法 1:手动运行

在 CLion 终端中执行:

cmake --build .
./MyGoogleTestProject

你应该会看到 Google Test 的输出结果。

方法 2:CLion 直接运行

  1. 在 CLion 运行
    选择模块运行

  2. 使用 Google Test 配置

    • 点击 CLion 顶部菜单 “Run” > “Edit Configurations…”
    • 点击 “+” 号,选择 Google Test
    • 选择 Target,然后应用并运行
  3. 查看测试结果
    在 CLion 底部的 “Test Runner” 窗口,你可以看到测试是否通过。

测试结果


6. 添加更多测试

如果你有多个测试文件,比如 math_test.cppstring_test.cpp,可以这样修改 CMakeLists.txt

add_executable(math_test math_test.cpp)
add_executable(string_test string_test.cpp)target_link_libraries(math_test GTest::GTest GTest::Main)
target_link_libraries(string_test GTest::GTest GTest::Main)add_test(NAME MathTest COMMAND math_test)
add_test(NAME StringTest COMMAND string_test)

然后在终端运行:

ctest

这样可以一次性运行所有测试。


7. 处理 Google Test 断言

Google Test 断言分为 ASSERT_EXPECT_

  • EXPECT_EQ(a, b): 继续运行,报告错误
  • ASSERT_EQ(a, b): 立即终止当前测试

例如:

TEST(SampleTest, Example) {ASSERT_EQ(1, 1); // 通过EXPECT_EQ(1, 2); // 失败,但继续执行ASSERT_EQ(1, 2); // 失败,测试终止
}

8. 使用 Google Test Fixtures

Google Test 提供 Fixture(测试夹具),用于在多个测试用例间共享资源:

class MyTestFixture : public ::testing::Test {
protected:void SetUp() override { nValue = 5; } // 每个测试前执行void TearDown() override { }          // 每个测试后执行int nValue;
};TEST_F(MyTestFixture, TestAddition) {EXPECT_EQ(nValue + 5, 10);
}

总结

  1. 安装 Google Test (brew install googletest 或 CMake FetchContent)
  2. 配置 CMakeLists.txt
  3. 编写 Google Test 代码
  4. 运行 Google Test
  5. 在 CLion 进行 Google Test 配置
  6. 使用 CTest 运行所有测试
  7. 使用断言 EXPECT_ / ASSERT_
  8. 使用 Test Fixture 进行高级测试

这样,你就能在 macOS + CLion 环境下使用 Google Test 进行 C++ 单元测试了!🚀

相关文章:

在 macOS 上使用 CLion 进行 Google Test 单元测试

介绍 Google Test&#xff08;GTest&#xff09;是 Google 开源的 C 单元测试框架&#xff0c;它提供了简单易用的断言、测试夹具&#xff08;Fixtures&#xff09;和测试运行机制&#xff0c;使 C 开发者能够编写高效的单元测试。 本博客将介绍如何在 macOS 上使用 CLion 配…...

Python SQLite3 保姆级教程:从零开始学数据库操作

Python SQLite3 保姆级教程&#xff1a;从零开始学数据库操作 本文适合纯新手&#xff01;无需任何数据库基础&#xff0c;跟着步骤操作即可掌握 SQLite3 的核心用法。 目标&#xff1a;让你像用记事本一样轻松操作数据库&#xff01; 目录 什么是 SQLite3&#xff1f;环境准…...

深度解析:视频软编码与硬编码的优劣对比

视频编码 一、基本原理与核心技术 压缩原理 通过时空冗余消除实现数据压缩&#xff1a; 空间冗余&#xff1a;利用帧内预测&#xff08;如DC/角度预测&#xff09;消除单帧内相邻像素相似性。时间冗余&#xff1a;运动估计与补偿技术&#xff08;ME/MC&#xff09;减少连续帧间…...

Azure云生态系统详解:核心服务、混合架构与云原生概念

核心服务&#xff1a;深入掌握Azure SQL Database、Azure Database for PostgreSQL、Azure Database for MySQL的架构、备份恢复、高可用性配置&#xff08;如Geo-Replication、自动故障转移组、异地冗余备份&#xff09;。混合架构&#xff1a;熟悉Azure Arc&#xff08;管理混…...

人工智能之数学基础:正交矩阵

本文重点 正交矩阵是线性代数中一个重要的特殊矩阵&#xff0c;它在许多领域都有广泛的应用。 什么是正交矩阵 如图所示&#xff0c;当矩阵A满足如上所示的条件的时候&#xff0c;此时我们就可以认为是正交矩阵&#xff0c;需要注意一点矩阵A必为方阵。 正交矩阵的充要条件 …...

分布式锁—7.Curator的分布式锁

大纲 1.Curator的可重入锁的源码 2.Curator的非可重入锁的源码 3.Curator的可重入读写锁的源码 4.Curator的MultiLock源码 5.Curator的Semaphore源码 1.Curator的可重入锁的源码 (1)InterProcessMutex获取分布式锁 (2)InterProcessMutex的初始化 (3)InterProcessMutex.…...

【笔记】STM32L4系列使用RT-Thread Studio电源管理组件(PM框架)实现低功耗

硬件平台&#xff1a;STM32L431RCT6 RT-Thread版本&#xff1a;4.1.0 目录 一.新建工程 二.配置工程 ​编辑 三.移植pm驱动 四.配置cubeMX 五.修改驱动文件&#xff0c;干掉报错 六.增加用户低功耗逻辑 1.设置唤醒方式 2.设置睡眠时以及唤醒后动作 ​编辑 3.增加测试命…...

C++什么是深复制和浅复制,构造函数和析构函数,哪一个可以写成虚函数,为什么?

在C之中深复制是指对于值类型复制它的值&#xff0c;对于指针类型不仅仅复制指针指向的值&#xff0c;还会重新分配一个内存空间用于放置复制的值&#xff08;对动态分配的内存进行重新分配和内存复制&#xff09;&#xff0c;这种深复制不会出现悬空指针的问题&#xff0c;但是…...

从连接到交互:SDN 架构下 OpenFlow 协议的流程与报文剖析

在SDN架构中&#xff0c;交换机与控制器之间的通信基于 OpenFlow协议&#xff0c;其设计目的是实现控制平面与数据平面的解耦。以下是 交换机连接控制器 和 数据包进入交换机触发交互 的详细流程及协议报文分析&#xff1a; 一、交换机连接控制器的流程&#xff08;初始化阶段&…...

第七课:Python反爬攻防战:Headers/IP代理与验证码

在爬虫开发过程中&#xff0c;反爬虫机制成为了我们必须面对的挑战。本文将深入探讨Python爬虫中常见的反爬机制&#xff0c;并详细解析如何通过随机User-Agent生成、代理IP池搭建以及验证码识别来应对这些反爬策略。文章将包含完整的示例代码&#xff0c;帮助读者更好地理解和…...

Golang学习笔记_47——访问者模式

Golang学习笔记_44——命令模式 Golang学习笔记_45——备忘录模式 Golang学习笔记_46——状态模式 文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 编译器实现2. 财务系统3. UI组件系统 四、Go语言实现示例完整实现代码执行结果 五、…...

软件高级架构师 - 软件工程

补充中 测试 测试类型 静态测试 动态测试 测试阶段 单元测试中&#xff0c;包含性能测试&#xff0c;如下&#xff1a; 集成测试中&#xff0c;包含以下&#xff1a; 维护 遗留系统处置 高水平低价值&#xff1a;采取集成 对于这类系统&#xff0c;采取 集成 的方式&…...

IDEA 基础配置: maven配置 | 服务窗口配置

文章目录 IDEA版本与MAVEN版本对应关系maven配置镜像源插件idea打开服务工具窗口IDEA中的一些常见问题及其解决方案IDEA版本与MAVEN版本对应关系 查找发布时间在IDEA版本之前的dea2021可以使用maven3.8以及以前的版本 比如我是idea2021.2.2 ,需要将 maven 退到 apache-maven-3.…...

Qt之QGraphicsView图像操作

QGraphicsView图像操作:旋转、放大、缩小、移动、图层切换 1 摘要 GraphicsView框架结构主要包含三个主要的类QGraphicsScene(场景)、QGraphicsView(视图)、QGraphicsItem(图元)。QGraphicsScene本身不可见,是一个存储图元的容器,必须通过与之相连的QGraphicsView视图来显…...

人工智能之数学基础:对线性代数中逆矩阵的思考?

本文重点 逆矩阵是线性代数中的一个重要概念,它在线性方程组、矩阵方程、动态系统、密码学、经济学和金融学以及计算机图形学等领域都有广泛的应用。通过了解逆矩阵的定义、性质、计算方法和应用,我们可以更好地理解和应用线性代数知识,解决各种实际问题。 关于逆矩阵的思…...

嵌入式开发之串行数据处理

前题 前面几篇文章写了关于嵌入式软件开发时&#xff0c;关于串行数据处理的一些相关内容&#xff0c;有兴趣的可以看看《嵌入式开发&#xff1a;软件架构、驱动开发与串行数据处理》、《嵌入式软件开发之生产关系模型》和《嵌入式开发之Modbus-RTU协议解析》相关的内容。从业十…...

机器学习(六)

一&#xff0c;决策树&#xff1a; 简介&#xff1a; 决策树是一种通过构建类似树状的结构&#xff08;颠倒的树&#xff09;&#xff0c;从根节点开始逐步对数据进行划分&#xff0c;最终在叶子节点做出预测结果的模型。 结构组成&#xff1a; 根节点&#xff1a;初始的数据集…...

结合unittest和pytest进行虚拟数据库测试

使用 pytest 和 MagicMock 模拟数据库操作&#xff0c;并测试假设的 create_user 函数&#xff0c;将用户添加到数据库中。 代码实现 from datetime import date from typing import List, Optional from unittest.mock import MagicMock from pydantic import BaseModel, Fi…...

Spring Boot 监听器(Listeners)详细教程

Spring Boot 监听器&#xff08;Listeners&#xff09;详细教程 目录 Spring Boot 监听器概述监听器核心概念最佳使用场景实现步骤高级配置详细使用场景总结 1. Spring Boot 监听器概述 Spring Boot 监听器&#xff08;Listeners&#xff09;基于 Spring Framework 的事件机制…...

工具介绍《githack》以及Git 命令行

一、Githack 工具介绍 Githack 是一个用于检测和利用网站 .git 目录泄露漏洞的安全工具。当网站错误配置导致 .git 目录可公开访问时&#xff0c;攻击者可通过该工具下载 .git 中的版本控制文件&#xff0c;并重建完整的项目源代码。 核心用途 检测 .git 目录泄露漏洞。从泄…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...