GoogleTest 01_总览
GoogleTest 是 C++ 项目中常用的单元测试框架。它的价值不只是提供 EXPECT_EQ 这类断言宏,更重要的是帮助工程建立可重复执行、可定位失败、可持续演进的测试体系。
学习 GoogleTest 时建议按三个层次推进:
- 会写测试:理解测试用例、断言、夹具、参数化测试。
- 会接入工程:理解 CMake、CTest、持续集成、覆盖率统计。
- 会分析机制:理解注册、运行、断言上报、事件监听器等源码设计。
学习路线
测试基本概念
-> GoogleTest 简介与第一个测试
-> 常用断言与测试夹具
-> 参数化测试、死亡测试、匹配器
-> CMake 与工程集成
-> GoogleTest 源码分析
-> lcov、genhtml、gcovr 覆盖率工具链
-> 项目中的测试分层、命名、隔离与持续集成
章节目录
基础入门
API 说明
源码分析
工程集成
覆盖率工具
- lcov 使用方式及参数说明
- genhtml 使用方式及参数说明
- gcovr 使用方式及参数说明
- lcov 与 genhtml 覆盖率报告通用 Shell 脚本
- gcovr 覆盖率报告通用 Bat 与 Shell 脚本
工程实践
GoogleTest 适合解决什么问题
| 场景 | GoogleTest 能力 | 说明 |
|---|---|---|
| 函数级逻辑验证 | TEST、断言宏 |
验证输入输出和边界条件 |
| 类成员行为验证 | TEST_F、测试夹具 |
复用初始化与清理逻辑 |
| 多组输入验证 | TEST_P、INSTANTIATE_TEST_SUITE_P |
避免重复编写相同结构的测试 |
| 异常和错误路径 | EXPECT_THROW、EXPECT_DEATH |
验证异常、断言失败、进程退出 |
| 工程自动化 | CTest、XML 输出、过滤器 | 适合接入 CI 和测试报告 |
| 覆盖率评估 | gcov、lcov、genhtml、gcovr | 观察测试是否触达关键代码 |
单元测试的基本思维
单元测试不是把所有代码跑一遍,而是把一个小的行为边界固定下来。一个好的测试通常包含三个部分:
- Arrange:准备输入、对象、依赖。
- Act:执行被测行为。
- Assert:检查结果、状态或交互。
#include <gtest/gtest.h>
int Add(int lhs, int rhs) {
return lhs + rhs;
}
TEST(MathTest, AddReturnsSum) {
const int result = Add(2, 3);
EXPECT_EQ(result, 5);
}
GoogleTest 与其他测试工具的关系
GoogleTest 主要负责“运行测试和表达断言”。在真实工程里,它通常和以下工具配合:
| 工具 | 角色 |
|---|---|
| CMake | 构建测试目标、链接 GoogleTest |
| CTest | 发现和执行测试,统一测试入口 |
| gcov | GCC 生成覆盖率原始数据 |
| lcov | 收集、过滤、汇总覆盖率数据 |
| genhtml | 把 lcov 数据生成 HTML 报告 |
| gcovr | 生成文本、HTML、XML、Cobertura 覆盖率报告 |
| CI 系统 | 自动构建、测试、归档报告 |