首页 > 后端开发 > C++ > 正文

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

尼克
发布: 2025-10-26 22:49:01
原创
815人浏览过
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">
                        <a class="aritcle_card_img" href="/ai/2095">
                            <img src="https://img.php.cn/upload/ai_manual/001/246/273/68b6cab553c77389.png" alt="青柚面试">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/ai/2095">青柚面试</a>
                            <p>简单好用的日语面试辅助工具</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="青柚面试">
                                <span>57</span>
                            </div>
                        </div>
                        <a href="/ai/2095" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="青柚面试">
                        </a>
                    </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;"><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 工具自动运行。不复杂但容易忽略的是保持测试独立性和快速执行。

以上就是C++怎么使用Google Test框架_C++ gtest单元测试框架使用教程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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