深入了解 Google Test (gtest):一份详细的指南

news/2024/12/25 12:41:22/文章来源:https://www.cnblogs.com/cypre/p/18630128

Google Test(gtest)是 Google 提供的一款 C++ 测试框架,它广泛应用于 C++ 项目的单元测试。无论是初学者还是经验丰富的开发者,gtest 都是一个强大而灵活的工具,能够帮助你编写和执行单元测试,确保你的代码质量和稳定性。本文将从 gtest 的基本概念到高级特性,逐步带你深入了解如何使用它进行高效的 C++ 测试。

1. 什么是 Google Test?

Google Test 是 Google 开发的 C++ 测试框架,设计用于进行单元测试(Unit Testing)。它提供了丰富的断言(assertion)和测试机制,能够帮助开发者编写测试代码并自动执行,检测代码中的潜在缺陷。gtest 的目标是提供一个易于使用且强大的测试框架,兼具可扩展性和灵活性。

gtest 支持多种测试风格和断言方法,能够方便地集成到现有的 C++ 项目中,并且具有很好的跨平台支持。

2. gtest 的安装与配置

2.1 安装 gtest

使用 vcpkg 安装(Windows)

如果你在 Windows 环境下使用 Visual Studio,可以通过 vcpkg 安装 gtest:

vcpkg install gtest

使用 brew 安装(macOS)

在 macOS 上,你可以使用 Homebrew 来安装 gtest:

brew install googletest

从源码编译安装(通用)

你还可以直接从源码编译安装 Google Test。以下是一般的安装步骤:

  1. 克隆 gtest 仓库:

    git clone https://github.com/google/googletest.git
    
  2. 进入目录并创建构建文件夹:

    cd googletest
    mkdir build
    cd build
    
  3. 使用 CMake 生成构建文件并编译:

    cmake ..
    make
    sudo make install
    

2.2 配置 CMake

在你的 CMake 项目中集成 gtest,首先需要在 CMakeLists.txt 中找到 gtest,并将其链接到你的测试目标。可以参考以下配置:

# 找到并引入 Google Test
find_package(GTest REQUIRED)# 包含头文件
include_directories(${GTEST_INCLUDE_DIRS})# 你的测试目标
add_executable(my_test test.cpp)# 链接 gtest 库
target_link_libraries(my_test ${GTEST_LIBRARIES} pthread)

3. 基本概念与用法

在 gtest 中,测试用例是由 测试夹具(Test Fixtures)测试用例(Test Cases) 组成的。

3.1 测试夹具(Test Fixture)

测试夹具是一个类,用来定义在多个测试用例中共享的初始化和清理操作。它可以看作是一个包含常用测试代码的模板,方便重复使用。测试夹具类需要继承自 ::testing::Test

例如:

#include <gtest/gtest.h>class MyTestFixture : public ::testing::Test {
protected:// 初始化代码,测试之前运行void SetUp() override {// 设置操作}// 清理代码,测试之后运行void TearDown() override {// 清理操作}// 你可以在这里定义任何测试需要的成员int value = 42;
};

3.2 编写测试用例

在 gtest 中,测试用例通过宏 TEST_FTEST 定义。TEST_F 用于使用测试夹具,而 TEST 用于没有夹具的简单测试。

使用 TEST_F 和测试夹具

TEST_F(MyTestFixture, TestAddition) {EXPECT_EQ(value + 1, 43);  // 断言:value+1 等于 43
}TEST_F(MyTestFixture, TestSubtraction) {EXPECT_EQ(value - 1, 41);  // 断言:value-1 等于 41
}

使用 TEST 编写无夹具的测试

TEST(MyTest, TestMultiplication) {int x = 5;int y = 10;EXPECT_EQ(x * y, 50);
}

3.3 断言(Assertions)

gtest 提供了丰富的断言宏,帮助你检查代码的行为是否符合预期。常用的断言有:

  • EXPECT_EQ(val1, val2):检查 val1 是否等于 val2。如果不等,测试继续执行。
  • ASSERT_EQ(val1, val2):检查 val1 是否等于 val2,如果不等,测试终止。
  • EXPECT_TRUE(val):检查 val 是否为 true
  • ASSERT_TRUE(val):检查 val 是否为 true,如果不为 true,测试终止。
  • EXPECT_FALSE(val):检查 val 是否为 false
  • ASSERT_FALSE(val):检查 val 是否为 false,如果不为 false,测试终止。
  • EXPECT_NE(val1, val2):检查 val1 是否不等于 val2
  • EXPECT_LT(val1, val2):检查 val1 是否小于 val2

例如:

TEST(MyTest, TestAssertions) {int a = 5;int b = 10;// 判断 a 是否小于 bEXPECT_LT(a, b);  // 判断 a 是否不等于 bEXPECT_NE(a, b);  // 判断 a 是否等于 5ASSERT_EQ(a, 5);  
}

4. 高级特性

4.1 测试参数化(Parameterized Tests)

gtest 允许你编写参数化的测试用例,便于重复测试多个输入数据。

定义参数化测试

class MyTestParam : public ::testing::TestWithParam<int> {
};TEST_P(MyTestParam, TestMultiplication) {int input = GetParam();EXPECT_EQ(input * 2, input + input);
}// 使用不同的参数集合执行测试
INSTANTIATE_TEST_SUITE_P(PositiveNumbers, MyTestParam, ::testing::Values(1, 2, 3, 4));

运行参数化测试

运行时,gtest 会为每个参数实例化一个测试用例,类似于:

[ RUN      ] MyTestParam.TestMultiplication/0
[       OK ] MyTestParam.TestMultiplication/0 (0 ms)
[ RUN      ] MyTestParam.TestMultiplication/1
[       OK ] MyTestParam.TestMultiplication/1 (0 ms)
...

4.2 自定义断言

有时,你可能需要编写自定义的断言。可以通过继承 ::testing::Matcher 来实现。以下是一个简单的例子:

#include <gtest/gtest.h>class IsEven : public ::testing::MatcherInterface<int> {
public:explicit IsEven() {}bool MatchAndExplain(int n, ::testing::MatchResultListener* listener) const override {return n % 2 == 0;}void DescribeTo(std::ostream* os) const override {*os << "is an even number";}void DescribeNegationTo(std::ostream* os) const override {*os << "is not an even number";}
};MATCHER(IsEven, "is an even number") {return arg % 2 == 0;
}TEST(MyTest, CustomAssertion) {EXPECT_THAT(4, IsEven()); // 使用自定义断言EXPECT_THAT(5, Not(IsEven())); // 使用自定义断言并检查失败情况
}

5. 集成与持续集成(CI)

gtest 可以非常方便地与持续集成工具(如 Jenkins、GitHub Actions 等)结合使用。你只需在 CI 构建过程中运行测试命令,测试结果会自动报告并作为构建的反馈之一。

CMakeLists.txt 中添加测试支持,通常需要包含以下内容:

enable_testing()
add_test(NAME MyTest COMMAND my_test)

在 CI 环境中,你可以通过以下命令运行测试:

ctest

6. 总结

Google Test 是一个功能强大的 C++ 单元测试框架,提供了易于使用的 API 和广泛的功能,支持各种常见的单元测试需求,包括断言、参数化测试和自定义断言等。无论是对初学者还是经验丰富的开发者,gtest 都是一个非常有用的工具。通过本文的介绍,相信你已经对 gtest 的基本使用和高级特性有了更深入的了解

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

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

相关文章

数据误删?别怕!COS防误删攻略请查收

在云存储领域,数据的安全性始终是悬在头顶的达摩克利斯之剑。长期以来,腾讯云对象存储服务(COS)一直致力于数据安全的探索和实践,以保障数据的安全性和完整性。对象存储COS准备了一份防误删攻略给大家: 背景与意义在云存储领域,数据的安全性始终是悬在头顶的达摩克利斯之…

【日记】拼好了衣架!(524 字)

正文今早不小心把闹钟给关了,继 7:50 闹钟响了之后,下一次睁眼就是 8:28 了。吓得一哆嗦,穿衣服换鞋的速度起飞。到一楼,正好 8:30。还好行长没来(小声。昨天晚上,朝哥给我说他伤好得差不多了,可以开始考虑上课了。我一直在等他说出这句话。暑假班他受伤,完事儿之后我受…

【原创】解决ncnn yolov11 乱框,输出维度出错,无框问题

Abstract 解决:ncnn yolov11 乱框,输出维度出错,无框问题 Solution: ncnn yolov11 has random boxes, incorrect output dimensions, and no boxes 0x00: model export 首先是模型转换问题 最开始,我是用python的ultralytics导出为onnx格式文件(.onnx),这个文件在python的…

polarctf-crypto中等难度wp整理(截止至2024.12)

二进制一个音频文件,听了,不是摩斯电码看了wp,原来是拨号 考察:DTMF拨号音识别 使用dtmf2num这个工具解析这个音频二进制1和0 但是不是,它是01字符变形成摩斯密码,把0替换成.,把1替换成-,把*替换成空格。 得到一组摩斯电码,然后去解即可还要小写md5加密,服了这个老六…

杭州数据恢复之某公司经理的三星移动硬盘摔坏了盘片划伤二次开盘

这是一块老款三星Samsung使用mini USB接口的500G移动硬盘,采用了一体式电路板,型号是HM502JX。硬盘是用户不小心摔坏了,接电脑不识别而且有异响,先送修到百脑汇电脑城某家数据恢复中心进行开盘修复,但被告知盘片有划伤无法恢复数据。很巧用户公司里的一名员工曾经在我们这…

第十七次作业

1、安装最新版phpstudy集成工具并创建一个网站,编写php代码输出网站信息(phpinfo)2、安装vscode,并安装php开发插件、汉化插件、xdebug等插件 中⽂语⾔包安装php调试插件配置Open PHP/HTML/JS In Browser插件3、配置phpstudy集成工具xdebug扩展,并使用vscode对php代码进行…

dataezse接入zabbix监控

常用查询 目录常用查询zabbix 常用库表说明主机资源监控主机资源监控(纯值)oracle状态监控CPU top10DISK TOP 10Memory TOP 10SPACE USERD TOP 10问题告警级别分布问题列表null问题主机组正常主机总数主机问题排行 zabbix 常用库表说明 https://www.cnblogs.com/yaoyaojcy/p/…

MySQL 千万 级数据量根据(索引)优化 查询 速度

MySQL 千万 级数据量根据(索引)优化 查询 速度| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------| -----…

kafka中文教程

kafka中文教程| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------| -------------| -------------| -------…

银河麒麟桌面操作系统 使用root登录桌面端

麒麟 V10 桌面操作系统使用 root 登录 - 乔京飞 - 博客园 一、允许使用 root 用户登录 麒麟 V10 桌面操作系统安装过程后(或者安装完成后),必须创建一个新用户才能使用。很多目录中的文件,只能看不能改,甚至连创建一个新文件都不行。在终端执行命令,需要频繁的使用 sudo …

oracle exp 无法导出空表

oracle exp 无法导出空表| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------| -------------| ------------…