在《使用GTest进行单元测试的简明指南》中,我们学习了如何使用 GTest 编写基本的测试用例。
但是在实际项目中,测试需求往往更复杂:多个用例需要相同的初始化、依赖对象难以控制、测试是否足够全面难以评估……
本文将带你实战掌握 GTest 的高级功能:Test Fixture(测试夹具)、Mock(模拟对象) 与 覆盖率分析,帮助你写出更清晰、可维护的测试代码。
核心概念简述
Test Fixture(测试夹具)
当多个测试共享相同的初始化和清理逻辑时,使用夹具类继承 ::testing::Test 并重载 SetUp() 和 TearDown() 方法可以避免重复代码、提升测试独立性。
典型场景有:
- 测试中多次创建类对象
- 临时文件
SetUp()会在测试开始时自动运行,TearDown()则会在测试结束时自动运行。
Mock(模拟对象)
当被测试对象依赖外部模块(如网络、数据库、传感器等)时,Mock 可以替代这些依赖,模拟各种行为和边界情况,隔离测试对象。
常见用途有:
- 模拟返回特定结果;
- 模拟异常或错误行为;
- 验证方法是否被调用,以及调用次数与参数。
代码覆盖率
覆盖率衡量测试对代码的执行程度。
它虽然不能完全代表测试质量,但能有效代码中识别未被测试的路径。
待测对象:Calculator
我们以一个简单的加法器为例,它通过 Validator 对象判断加法是否会导致整数溢出。如果合法就执行累加,否则将结果重置为 0。
核心代码如下(代码仓库在底部):
include/my_math.h
#pragma once
#include <climits>
#include <string>
class Validator {
public:
virtual ~Validator() = default;
virtual bool IsValid(int current, int to_add);
};
class Calculator {
public:
Calculator(Validator* validator);
void Add(int a);
void Reset();
int GetResult();
private:
Validator

最低0.47元/天 解锁文章
7313

被折叠的 条评论
为什么被折叠?



