0

0

C++怎么使用Google Test框架_C++ gtest单元测试框架使用教程

尼克

尼克

发布时间:2025-10-26 22:49:01

|

869人浏览过

|

来源于php中文网

原创

Google Test是C++中流行的单元测试框架,支持断言、测试夹具和参数化测试。1. 可通过包管理器或CMake的FetchContent集成;2. 编写测试用例使用TEST宏和EXPECT_EQ等断言;3. CMake构建时链接GTest::gtest_main并启用测试;4. 断言分为EXPECT(继续执行)和ASSERT(终止)两类;5. 测试夹具TEST_F用于共享初始化逻辑;6. 参数化测试TEST_P结合INSTANTIATE_TEST_SUITE_P可对多组数据运行相同逻辑。推荐将测试独立存放并接入CI流程,确保测试快速且隔离。

c++怎么使用google test框架_c++ gtest单元测试框架使用教程

Google Test(简称 gtest)是 C++ 中最流行的单元测试框架之一,由 Google 开发并开源。它支持丰富的断言、测试夹具(Test Fixtures)、参数化测试等功能,适合用于各种规模的 C++ 项目中进行单元测试。

1. 安装与配置 Google Test

在使用 gtest 前,需要先将其集成到你的项目中。常见方式有:通过包管理器安装或从源码编译。

Ubuntu / Debian 系统:

sudo apt-get install libgtest-dev cmake
cd /usr/src/gtest
sudo cmake .
sudo make
sudo cp *.a /usr/lib

或者使用 vcpkg(推荐):

立即学习C++免费学习笔记(深入)”;

vcpkg install googletest

也可以在项目中直接使用 CMake 添加:

include(FetchContent)
FetchContent_Declare(
  googletest
  URL https://www.php.cn/link/5d810d095c3f16cce86a8b99060ff44c
)
FetchContent_MakeAvailable(googletest)

这样可以在项目中自动下载并链接 gtest,无需系统级安装。

2. 编写第一个测试用例

假设你有一个简单的加法函数需要测试:

// math.h
#ifndef MATH_H
#define MATH_H
int add(int a, int b);
#endif
// math.cpp
#include "math.h"
int add(int a, int b) {
    return a + b;
}

现在编写测试文件 test_math.cpp:

#include 
#include "math.h"

// 测试用例:测试 add 函数 TEST(MathTest, AddFunction) { EXPECT_EQ(add(2, 3), 5); EXPECT_EQ(add(-1, 1), 0); EXPECT_EQ(add(0, 0), 0); }

// 主函数(如果 gtest 已经链接了 main,这里可以不写) int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }

3. 使用 CMake 构建测试项目

创建 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.14)
project(MyTestProject)

set(CMAKE_CXX_STANDARD 17)

添加源文件和测试文件

add_library(math_lib math.cpp)

笔头写作
笔头写作

AI为论文写作赋能,协助你从0到1。

下载

使用 FetchContent 获取 gtest

include(FetchContent) FetchContent_Declare( googletest URL https://www.php.cn/link/5d810d095c3f16cce86a8b99060ff44c ) FetchContent_MakeAvailable(googletest)

添加测试可执行文件

enable_testing()

add_executable(test_math test_math.cpp) target_link_libraries(test_math math_lib GTest::gtest_main)

注册测试

add_test(NAME MathTest ADD_COMMANDS test_math)

构建流程:

mkdir build
cd build
cmake ..
make
./test_math

运行后你会看到类似输出:

[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from MathTest
[ RUN      ] MathTest.AddFunction
[       OK ] MathTest.AddFunction (0 ms)
[----------] 1 test from MathTest (0 ms total)
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 1 test.

4. 常用断言介绍

gtest 提供两类断言:ASSERT 和 EXPECT。

  • ASSERT_*:失败时终止当前测试函数
  • EXPECT_*:失败时记录错误,继续执行后续语句

常见断言示例:

EXPECT_EQ(a, b);     // 相等
EXPECT_NE(a, b);     // 不相等
EXPECT_LT(a, b);     // 小于
EXPECT_LE(a, b);     // 小于等于
EXPECT_GT(a, b);     // 大于
EXPECT_GE(a, b);     // 大于等于

EXPECT_TRUE(condition); // 条件为真 EXPECT_FALSE(condition); // 条件为假

EXPECT_STREQ(s1, s2); // 字符串相等(C风格) EXPECT_STRNE(s1, s2); // 字符串不等 EXPECT_THROW(stmt, ExceptionType); // 是否抛出异常 EXPECT_NO_THROW(stmt); // 是否不抛出异常

5. 使用测试夹具(Test Fixtures)

当你需要多个测试共享相同数据或初始化逻辑时,可以使用 TEST_F。

class MyStringTest : public ::testing::Test {
protected:
    void SetUp() override {
        str1 = "Hello";
        str2 = "World";
    }
void TearDown() override {
    // 清理资源(如有)
}

std::string str1;
std::string str2;

};

TEST_F(MyStringTest, Concatenate) { std::string result = str1 + " " + str2; EXPECT_EQ(result, "Hello World"); }

每个以 TEST_F 定义的测试都会创建一个新的 MyStringTest 实例,确保隔离性。

6. 参数化测试

如果你希望用不同输入运行同一测试逻辑,可以使用参数化测试。

class SquareTest : public ::testing::TestWithParam {};

TEST_P(SquareTest, PositiveNumbers) { int input = GetParam(); EXPECT_EQ(input * input, Square(input)); }

// 指定测试参数 INSTANTIATE_TEST_SUITE_P(Default, SquareTest, ::testing::Values(1, 2, 3, 4));

上述代码会为每个值生成一个独立测试用例。

基本上就这些。掌握以上内容后,你已经可以熟练在 C++ 项目中使用 Google Test 进行单元测试了。实际开发中建议将测试代码放在单独目录,并配合 CI 工具自动运行。不复杂但容易忽略的是保持测试独立性和快速执行。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

常见的linux系统有哪些
常见的linux系统有哪些

linux系统有Ubuntu、Fedora、CentOS、Debian、openSUSE、Arch Linux、Gentoo、Slackware、Linux Mint、Kali Linux。更多关于linux系统的文章详情请阅读本专题下面的文章。php中文网欢迎大家前来学习。

816

2023.10.27

ubunt上安装和配置vnc
ubunt上安装和配置vnc

安装方法:安装VNC服务器、启动VNC服务器、设置VNC密码等等。想了解更多ubuntu的相关内容,可以阅读本专题下面的文章。

414

2023.12.28

ubuntu启动黑屏解决方法
ubuntu启动黑屏解决方法

ubuntu启动黑屏解决方法:检查是否是电源问题、检查内存是否接触不良、检查显卡问题等。想了解更多ubuntu的相关内容,可以阅读本专题下面的文章。

659

2023.12.28

为什么ubuntu有网络连接但不能上网
为什么ubuntu有网络连接但不能上网

ubuntu有网络连接但不能上网的原因:1、dns配置问题;2、代理服务器设置问题;3、网络防火墙设置问题;4、路由器或调制解调器设置问题;5、网络驱动程序问题;6、网络配置文件问题;7、其他问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

460

2024.09.05

ubuntu安装golang
ubuntu安装golang

本专题整合了ubuntu安装golang所有方法汇总,阅读下面的文章了解更多详细操作。

107

2025.12.13

常见的linux系统有哪些
常见的linux系统有哪些

linux系统有Ubuntu、Fedora、CentOS、Debian、openSUSE、Arch Linux、Gentoo、Slackware、Linux Mint、Kali Linux。更多关于linux系统的文章详情请阅读本专题下面的文章。php中文网欢迎大家前来学习。

816

2023.10.27

debian重启命令有哪些
debian重启命令有哪些

debian提供以下重启命令:1、reboot:立即重启系统;2、shutdown:指定重启时间(例如:shutdown -r +5 "system will reboot in 5 minutes.");3、systemctl reboot:控制系统服务和进程,包括重启系统;4、init(传统方法,不推荐);5、poweroff:关闭系统(非重启)。

692

2024.06.28

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

8

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 3.1万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号