3.测试实现与执行

基础框架

img

一、gtest(Google Test)

定位:Google 开源的 C++ 单元测试框架
核心功能

  1. 结构化测试
1
2
3
4
TEST(TestSuiteName, TestName) {        // 定义测试用例
EXPECT_EQ(3, Add(1, 2)); // 断言:验证相等
ASSERT_NE(nullptr, CreateObject()); // 断言失败则终止当前测试
}
  1. 测试夹具(Fixtures):复用初始化逻辑
1
2
3
4
5
6
7
8
9
10
class DatabaseTest : public ::testing::Test {
protected:
void SetUp() override { db.Connect(); } // 每个测试前执行
void TearDown() override { db.Disconnect(); } // 测试后清理
Database db;
};

TEST_F(DatabaseTest, InsertData) { // 使用夹具
EXPECT_TRUE(db.Insert("test_data"));
}
  1. 参数化测试:同一逻辑多组数据验证
1
2
INSTANTIATE_TEST_SUITE_P(IntValues, CalculatorTest, 
::testing::Values(1, 2, 5)); // 参数注入

关键特性

  • 死亡测试(检查程序崩溃)
  • 测试过滤(--gtest_filter=SuiteName.TestName
  • 生成 XML 报告(集成 CI 工具)

gtest测试

img

gtest断言

img


二、gmock(Google Mock)

定位:gtest 的扩展库,用于 创建模拟对象(Mock Objects)
核心场景:隔离被测代码的依赖(如数据库、网络等)
工作流程

  1. 定义模拟接口
1
2
3
4
class PaymentGateway {                       // 抽象接口
public:
virtual bool Charge(double amount) = 0; // 待模拟的虚方法
};
  1. 生成 Mock 类
1
2
3
4
5
#include <gmock/gmock.h>
class MockPaymentGateway : public PaymentGateway {
public:
MOCK_METHOD(bool, Charge, (double amount), (override)); // 自动生成模拟方法
};
  1. 设定模拟行为
1
2
3
4
5
6
7
8
TEST(PaymentTest, ChargeFails) {
MockPaymentGateway mock;
EXPECT_CALL(mock, Charge(100.0)) // 预期调用参数100.0
.WillOnce(Return(false)); // 模拟返回失败

OrderProcessor processor(&mock);
EXPECT_FALSE(processor.ProcessOrder(100));// 执行被测逻辑
}

高级功能

  • 参数匹配器(Ge(100), NotNull()
  • 调用次数验证(Times(2)
  • 顺序验证(InSequence

三、GDB(GNU Debugger)

定位:Linux/Unix 下的 命令行调试工具
核心用途:动态分析程序运行时状态(非测试框架,但为测试提供保障)
常用命令速查

命令 作用 示例
gdb ./a.out 启动调试程序
break main 在 main 函数设断点 break MyClass::method
run 运行程序到断点 run arg1 arg2
next (n) 单步执行(跳过函数)
step (s) 单步进入函数
print var 打印变量值 print *ptr@10(数组)
backtrace (bt) 查看调用栈 bt full(显示局部变量)
watch var 监控变量修改
core-file core 分析崩溃后的 core 转储文件 gdb ./a.out core

调试核心崩溃示例

1
2
3
4
5
$ gdb ./myapp core.1234              # 加载崩溃的程序和 core 文件
(gdb) backtrace # 查看崩溃时的调用栈
#0 0x00007f... in SomeFunction () # 定位崩溃函数
(gdb) frame 0 # 选择栈帧0
(gdb) print *pointer # 检查空指针解引用

三者关系:

img

典型工作流

  1. gtest 覆盖核心逻辑 → 发现边界条件错误
  2. gmock 隔离网络请求 → 验证超时处理逻辑
  3. 测试崩溃时用 GDB → 定位空指针访问位置

💡 总结

  • gtest = 单元测试的基础框架
  • gmock = 增强测试隔离性的模拟工具
  • GDB = 保障代码健壮性的调试利器
    三者共同构成 C++ 开发的质量保障闭环。