当前位置: 首页 > news >正文

Google Test 介绍和使用指南

文章目录

  • Google Test 介绍和使用指南
    • 主要特性
    • 安装 Google Test
      • 使用包管理器安装(Linux)
      • 使用 CMake 集成
    • 基本使用
      • 简单测试示例
      • 常用断言宏
      • 测试夹具(Test Fixtures)
      • 参数化测试
      • 死亡测试
    • 高级特性
      • 类型化测试
      • 值参数化测试
    • 运行测试
    • 与 CMake 集成示例
    • 最佳实践

Google Test 介绍和使用指南

Google Test(通常缩写为 gtest)是 Google 开发的一个 C++ 测试框架,用于编写和运行单元测试。它是目前最流行的 C++ 测试框架之一,具有丰富的功能和良好的跨平台支持。

主要特性

  1. 丰富的断言:提供多种断言宏用于验证测试结果
  2. 测试夹具:支持测试夹具(Test Fixtures)来共享测试设置和清理代码
  3. 参数化测试:支持参数化测试,可以用不同的参数运行相同的测试逻辑
  4. 死亡测试:可以测试程序是否按预期方式终止
  5. 跨平台:支持 Linux、Windows、Mac 等多种平台
  6. 与构建系统集成:易于与 CMake、Bazel 等构建系统集成

安装 Google Test

使用包管理器安装(Linux)

# Ubuntu/Debian
sudo apt-get install libgtest-dev# 编译并安装
cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make
sudo cp *.a /usr/lib

使用 CMake 集成

现代 CMake 项目可以通过 FetchContent 直接引入 Google Test:

include(FetchContent)
FetchContent_Declare(googletestURL https://github.com/google/googletest/archive/refs/heads/main.zip
)
FetchContent_MakeAvailable(googletest)

基本使用

简单测试示例

#include <gtest/gtest.h>// 测试函数
int Add(int a, int b) {return a + b;
}// 定义一个测试用例
TEST(TestAdd, PositiveNumbers) {EXPECT_EQ(Add(2, 3), 5);
}TEST(TestAdd, NegativeNumbers) {EXPECT_EQ(Add(-2, -3), -5);
}int main(int argc, char **argv) {testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}

常用断言宏

Google Test 提供两类主要断言:

  1. ASSERT_ 系列:失败时立即终止当前测试
  2. EXPECT_ 系列:失败时继续执行当前测试

常用断言:

  • EXPECT_EQ(val1, val2):验证相等
  • EXPECT_NE(val1, val2):验证不等
  • EXPECT_TRUE(condition):验证条件为真
  • EXPECT_FALSE(condition):验证条件为假
  • EXPECT_LT(val1, val2):验证 val1 < val2
  • EXPECT_LE(val1, val2):验证 val1 <= val2
  • EXPECT_GT(val1, val2):验证 val1 > val2
  • EXPECT_GE(val1, val2):验证 val1 >= val2
  • EXPECT_STREQ(str1, str2):验证字符串相等
  • EXPECT_THROW(statement, exception_type):验证抛出特定异常

测试夹具(Test Fixtures)

测试夹具允许你在多个测试间共享设置和清理代码:

class VectorTest : public testing::Test {
protected:void SetUp() override {v1.push_back(1);v2.push_back(2);v2.push_back(3);}void TearDown() override {// 清理代码}std::vector<int> v1;std::vector<int> v2;
};TEST_F(VectorTest, SizeTest) {EXPECT_EQ(v1.size(), 1);EXPECT_EQ(v2.size(), 2);
}TEST_F(VectorTest, ContentTest) {EXPECT_EQ(v1[0], 1);EXPECT_EQ(v2[0], 2);EXPECT_EQ(v2[1], 3);
}

参数化测试

class IsPrimeTest : public testing::TestWithParam<int> {// 可以在这里定义夹具
};TEST_P(IsPrimeTest, TestsIsPrime) {int n = GetParam();EXPECT_TRUE(IsPrime(n));
}INSTANTIATE_TEST_SUITE_P(PrimeValues, IsPrimeTest,testing::Values(2, 3, 5, 7, 11, 13, 17, 19));

死亡测试

验证代码是否按预期终止:

TEST(ExitTest, DiesCorrectly) {EXPECT_DEATH({fprintf(stderr, "Fatal error detected!\n");exit(1);}, "Fatal error detected!");
}

高级特性

类型化测试

template <typename T>
class TypedTest : public testing::Test {};typedef testing::Types<int, float, double> MyTypes;
TYPED_TEST_SUITE(TypedTest, MyTypes);TYPED_TEST(TypedTest, SizeTest) {EXPECT_EQ(sizeof(TypeParam), 4);  // 对int和float成立,double不成立
}

值参数化测试

class MyTest : public testing::TestWithParam<std::tuple<int, int>> {};TEST_P(MyTest, SumTest) {auto params = GetParam();int a = std::get<0>(params);int b = std::get<1>(params);EXPECT_EQ(a + b, Add(a, b));
}INSTANTIATE_TEST_SUITE_P(Default, MyTest,testing::Combine(testing::Range(1, 5),testing::Range(5, 10)));

运行测试

编译后运行测试程序,Google Test 会输出详细的测试结果:

[==========] Running 2 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 2 tests from TestAdd
[ RUN      ] TestAdd.PositiveNumbers
[       OK ] TestAdd.PositiveNumbers (0 ms)
[ RUN      ] TestAdd.NegativeNumbers
[       OK ] TestAdd.NegativeNumbers (0 ms)
[----------] 2 tests from TestAdd (0 ms total)[----------] Global test environment tear-down
[==========] 2 tests from 1 test suite ran. (0 ms total)
[  PASSED  ] 2 tests.

与 CMake 集成示例

完整 CMake 项目示例:

cmake_minimum_required(VERSION 3.14)
project(MyProject)# 引入Google Test
include(FetchContent)
FetchContent_Declare(googletestURL https://github.com/google/googletest/archive/refs/heads/main.zip
)
FetchContent_MakeAvailable(googletest)# 添加可执行文件
add_executable(my_teststest/test_main.cpptest/test_example.cppsrc/my_code.cpp
)# 链接Google Test
target_link_libraries(my_testsGTest::GTestGTest::Main
)# 添加测试
enable_testing()
add_test(NAME my_tests COMMAND my_tests)

最佳实践

  1. 测试命名应清晰表达其目的
  2. 每个测试应只验证一件事
  3. 使用夹具避免重复代码
  4. 优先使用 EXPECT_ 而非 ASSERT_,除非失败后继续测试无意义
  5. 为测试添加必要的注释
  6. 保持测试独立,不依赖执行顺序
  7. 定期运行测试,最好集成到CI/CD流程中

Google Test 提供了丰富的文档和示例,可以通过其 GitHub 仓库 获取更多信息。

http://www.dtcms.com/a/275130.html

相关文章:

  • 《QtPy:Python与Qt的完美桥梁》
  • STM32 IIC通信(寄存器与hal库实现)
  • 组件杠杠结构
  • 干眼症的预防与治疗
  • 域名锁是什么?有必要安装域名锁吗?
  • 拼数(字符串排序)
  • TransUnet医学图像分割模型
  • PrimeTime (PT Shell) report_timing 报告全字段完整解析
  • 深度对比扣子(Coze) vs n8n
  • halcon 求一个tuple的极值点
  • 上位机知识篇---高效下载安装方法
  • Auto-GPT 简易教程
  • Ant Design ProTable重置函数全解析
  • 【Ubuntu 22.04 ROS2 Humble】没有数字签名。 N: 无法安全地用该源进行更新
  • 47-RK3588 用瑞芯微官方提供recovery进行OTA升级
  • VR协作海外云:跨国企业沉浸式办公解决方案
  • ATAM与效用树:架构评估的核心方法论
  • 喷涂机器人cad【1张】+三维图+设计说明书+降重
  • 【SpringAI】6.向量检索(redis)
  • 【JAVA】面向对象三大特性之继承
  • PICO4 MR开发之外部存储读写
  • 论迹不论心
  • Vue和Element的使用
  • 【跟着PMP学习项目管理】每日一练 - 6
  • 深度学习归一化方法维度参数详解(C/H/W/D完全解析)
  • Linux学习笔记
  • ParaCAD 笔记 png 图纸标注数据集
  • 智能Agent场景实战指南 Day 10:产品经理Agent工作流
  • 【Zephyr开发实践系列】07_SPI-Flash数据操作的非对齐与边界处理分析
  • 栈和队列——队列