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 <gtest/gtest.h>
#include "math.h"
<p>// 测试用例:测试 add 函数
TEST(MathTest, AddFunction) {
EXPECT_EQ(add(2, 3), 5);
EXPECT_EQ(add(-1, 1), 0);
EXPECT_EQ(add(0, 0), 0);
}</p><p>// 主函数(如果 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)
<p>set(CMAKE_CXX_STANDARD 17)</p><h1>添加源文件和测试文件</h1><p>add_library(math_lib math.cpp)</p><div class="aritcle_card flexRow">
                                                        <div class="artcardd flexRow">
                                                                <a class="aritcle_card_img" href="/ai/2091" title="PPT.AI"><img
                                                                                src="https://img.php.cn/upload/ai_manual/000/000/000/175679993381810.png" alt="PPT.AI"  onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/ai/2091" title="PPT.AI">PPT.AI</a>
                                                                        <p>AI PPT制作工具</p>
                                                                </div>
                                                                <a href="/ai/2091" title="PPT.AI" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                        </div>
                                                </div><h1>使用 FetchContent 获取 gtest</h1><p>include(FetchContent)
FetchContent_Declare(
googletest
URL <a href="https://www.php.cn/link/5d810d095c3f16cce86a8b99060ff44c">https://www.php.cn/link/5d810d095c3f16cce86a8b99060ff44c</a>
)
FetchContent_MakeAvailable(googletest)</p><h1>添加测试可执行文件</h1><p>enable_testing()</p><p>add_executable(test_math test_math.cpp)
target_link_libraries(test_math math_lib GTest::gtest_main)</p><h1>注册测试</h1><p>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);     // 大于等于
<p>EXPECT_TRUE(condition);   // 条件为真
EXPECT_FALSE(condition);  // 条件为假</p><p>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";
    }
<pre class="brush:php;toolbar:false;">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<int> {};
<p>TEST_P(SquareTest, PositiveNumbers) {
int input = GetParam();
EXPECT_EQ(input * input, Square(input));
}</p><p>// 指定测试参数
INSTANTIATE_TEST_SUITE_P(Default, SquareTest, ::testing::Values(1, 2, 3, 4));

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

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

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

1031

2023.08.02

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

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

855

2023.10.27

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

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

429

2023.12.28

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

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

675

2023.12.28

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

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

478

2024.09.05

ubuntu安装golang
ubuntu安装golang

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

113

2025.12.13

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

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

855

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:关闭系统(非重启)。

706

2024.06.28

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

25

2026.03.13

热门下载

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

精品课程

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

共21课时 | 4.2万人学习

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

共8课时 | 1.6万人学习

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

共0课时 | 94人学习

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

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