【C++】googletest_TEST/TEST_F

在 Google Test 框架中,TESTTEST_F 是定义测试用例的两个核心宏,它们的区别主要体现在 测试上下文的管理方式 上。以下是二者的详细对比:


1. TEST

定义方式
TEST(TestSuiteName, TestName) {// 测试逻辑
}
特点
  • 独立上下文:每个测试用例独立运行,不共享任何状态。
  • 无初始化/清理:无法自动执行公共的设置(SetUp)和清理(TearDown)代码。
  • 适用场景
    适用于不需要共享资源的简单测试,或测试之间完全独立的情况。
示例
TEST(CalculatorTest, AddTwoNumbers) {Calculator calc;EXPECT_EQ(calc.Add(2, 3), 5);
}TEST(CalculatorTest, SubtractTwoNumbers) {Calculator calc;  // 每个测试独立创建对象EXPECT_EQ(calc.Subtract(5, 3), 2);
}

2. TEST_F

定义方式
TEST_F(TestFixtureClassName, TestName) {// 测试逻辑(可访问夹具成员)
}
特点
  • 共享上下文:测试用例基于一个 测试夹具(Test Fixture),所有测试共享相同的初始化和清理逻辑。
  • 自动调用 SetUp/TearDown
    每个测试运行前自动调用 SetUp(),运行后自动调用 TearDown()
  • 适用场景
    需要共享配置或资源(如数据库连接、文件句柄)的复杂测试。
示例
// 定义夹具类
class DatabaseTest : public testing::Test {
protected:void SetUp() override {db.Connect("test_db");  // 每个测试前连接数据库}void TearDown() override {db.Disconnect();        // 每个测试后断开连接}Database db;
};// 使用夹具
TEST_F(DatabaseTest, InsertRecord) {EXPECT_TRUE(db.Insert("data"));
}TEST_F(DatabaseTest, QueryRecord) {db.Insert("data");EXPECT_EQ(db.Query(), "data");
}

核心区别总结

特性TESTTEST_F
上下文管理独立上下文,无共享基于夹具共享上下文
初始化和清理手动处理自动调用 SetUp()TearDown()
资源复用每个测试独立创建资源所有测试共享夹具中的资源
代码冗余高(重复初始化代码)低(通过夹具复用代码)
适用场景简单、独立的测试需要共享配置或资源的复杂测试

如何选择?

  • 使用 TEST
    测试用例之间完全独立,无需共享任何设置或资源。

  • 使用 TEST_F
    测试用例需要共享相同的初始化和清理逻辑(例如配置数据库、创建临时文件)。


关键注意事项

  • 夹具类的生命周期
    每个 TEST_F 测试运行时,Google Test 会创建一个新的夹具对象,确保测试隔离。

  • 避免状态污染
    即使使用夹具,不同测试之间仍通过独立的夹具对象隔离状态。

  • 命名规范

    • TESTTestSuiteName 是自由命名的字符串。
    • TEST_FTestFixtureClassName 必须是已定义的夹具类名。

通过合理使用 TESTTEST_F,可以显著提高测试代码的可维护性和执行效率。

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

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

相关文章

14-DevOps-快速部署Kubernetes

在学习阶段,为了能快速部署Kubernetes,这里用一个快速安装工具:Kubeode,来完成Kubernetes的部署。 接下来部署一个单机,一主一从的Kubernetes。一主一从都部署在同一台服务器上。 在虚拟机新开一个服务器&#xff0c…

Java 异常处理全解析:从基础到自定义异常的实战指南

Java 异常处理全解析:从基础到自定义异常的实战指南 一、Java 异常体系:Error 与 Exception 的本质区别 1. 异常体系核心架构 Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。 在Java API中已经定义了许…

redis 数据类型新手练习系列——string类型

redis 数据类型 Redis 主要支持以下几种数据类型: (1)string(字符串): 基本的数据存储单元,可以存储字符串、整数或者浮点数。 (2)hash(哈希):一个键值对集…

Android12源码编译及刷机

由于google的AOSP源码拉取经常失败,编译还经常出现各种问题。这里根据香橙派Orange Pi 5 Plus(Android12电视镜像)源码进行编译演示。 RK芯片的开发板可玩性很高,这里以电视版本android系统为例子,学习的同时还可以当…

从零实现 registry.k8s.io/pause:3.8 镜像的导出与导入

以下是为 registry.k8s.io/pause:3.8 镜像的导出与导入操作定制的完整教程,适用于 Kubernetes 集群中使用 containerd 作为容器运行时的场景。本教程包含详细步骤、常见问题解析及注意事项。 从零实现 registry.k8s.io/pause:3.8 镜像的导出与导入 背景说明 Kuber…

Redis和MQ的区别

redis是一个高性能的key-value数据库,支持消息推送功能,可以当做一个轻量级的队列服务器使用。 redis只是提供一个高性能的、原子操作内存键值队,具有高速访问能力,虽然可以做消息队列的存储,但不具备消息队列的任何功…

Centos7系统防火墙使用教程

CentOS 7是一种常见的Linux操作系统,防火墙作为网络安全的第一道防线,对于服务器的安全至关重要。本文将介绍CentOS 7系统中防火墙的使用教程,包括如何开启、关闭、配置以及防火墙规则的添加和删除。 一、查看防火墙状态 在开始操作之前&am…

Uniapp:navigator(页面跳转)

目录 一、基本概述二、属性说明三、具体使用一、基本概述 页面跳转。该组件类似HTML中的<a>组件,但只能跳转本地页面。目标页面必须在pages.json中注册。 二、属性说明 属性名类型默认值说明平台差异说明urlString应用内的跳转链接,值为相对路径或绝对路径,如:“……

大疆机场及无人机上云(航线规划、指令飞行...)

系统操作预览&#xff1a; 包含一键起飞、指令飞行、云台控制、变焦、航线规划、空域规划、成果数据展示、实时飞行模拟、任务派发等 大疆无人机飞控平台&#xff08;航线规划、机场3、私有化部署&#xff09;_哔哩哔哩_bilibili 2025-04-02 更新 start、 已支持大疆机场3。…

【运维】云端掌控:用Python和Boto3实现AWS资源自动化管理

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在云计算时代,AWS(Amazon Web Services)作为领先的云服务平台,其资源管理的高效性对企业至关重要。本文深入探讨如何利用Python的boto3…

Java ThreadLocal与内存泄漏

当我们利用 ThreadLocal 来管理数据时&#xff0c;我们不可避免地会面临内存泄漏的风险。 原因在于 ThreadLocal 的工作方式。当我们在当前线程的 ThreadLocalMap 中存储一个值时&#xff0c;一旦这个值不再需要&#xff0c;释放它就变得至关重要。如果不这样做&#xff0c;那么…

Linux之netlink(2)libnl使用介绍(1)

Linux之netlink(2)Libnl3使用介绍(1) Author&#xff1a;Onceday Date&#xff1a;2025年4月26日 漫漫长路&#xff0c;才刚刚开始… 全系列文章可查看专栏: Linux内核知识_Once-Day的博客-CSDN博客 本文翻译自libnl3官方文档&#xff1a;Netlink Library (libnl) 参考文档…

深入理解TransmittableThreadLocal:原理、使用与避坑指南

一、ThreadLocal与InheritableThreadLocal回顾 在介绍TransmittableThreadLocal之前&#xff0c;我们先回顾一下Java中的ThreadLocal和InheritableThreadLocal。 1. ThreadLocal ThreadLocal提供了线程局部变量&#xff0c;每个线程都可以通过get/set访问自己独立的变量副本…

Linux下的I/O复用技术之epoll

I/O多路复用 指在单个线程或进程中&#xff0c;同时处理多个I/O操作的技术。 旨在提高程序处理多个并发I/O操作的能力&#xff0c;避免程序因等待某个I/O操作而被阻塞。在传统的I/O模型中当程序进行I/O操作时(如读取文件、接受网路数据等)&#xff0c;如果数据还未准备好&…

用 C 语言实现通用的冒泡排序算法

在日常编程中&#xff0c;排序算法是一个非常常见且重要的工具。虽然有许多排序算法可以选择&#xff0c;但如果你需要一个能够处理不同数据类型的排序算法&#xff0c;如何设计一个通用的排序算法呢&#xff1f;今天我们将实现一个通用的冒泡排序算法&#xff0c;支持不同数据…

C# 变量全解析:声明、初始化与使用

在多用途的编程语言中&#xff0c;程序存取数据是一项基础且关键的功能&#xff0c;而这一功能主要通过变量来实现。本文将全面深入地探讨 C# 中的变量&#xff0c;包括变量的种类、声明、初始化、自动初始化、多变量声明以及如何使用变量的值。 变量概述 变量是一个名称&…

Dify中的文本分词处理技术详解

Dify中的文本分词处理技术详解 引言核心架构概览索引处理器工厂 文本分词技术详解基础分词器增强型递归字符分词器固定分隔符文本分词器递归分割算法 索引处理器中的分词应用特殊索引处理器的分词特点问答索引处理器父子索引处理器 分词技术的应用场景技术亮点与优势总结 引言 …

如何打包python程序为可执行文件

将 Python 程序打包为可执行文件是一个常见需求&#xff0c;尤其是在希望将应用程序分享给不具备 Python 环境的用户时。以下是使用 PyInstaller 工具将 Python 程序打包为可执行文件的步骤。 步骤 1&#xff1a;安装 PyInstaller 如果您还没有安装 PyInstaller&#xff0c;请…

美团Java后端二面面经!

场景题是面试的大头&#xff0c;建议好好准备 Q. [美团]如何设计一个外卖订单的并发扣减库存系统&#xff1f; Q.[美团]为啥初始标记和重新标记需要STW&#xff1f; Q.[美团]骑手位置实时更新&#xff0c;如何保证高并发写入&#xff1f; Q.[美团]订单表数据量过大导致查询…