C++ 测试(代理技能)
针对现代 C++(C++17/20)的代理导向测试工作流,使用 GoogleTest/GoogleMock 和 CMake/CTest。
使用时机
- 编写新的 C++ 测试或修复现有测试
- 为 C++ 组件设计单元/集成测试覆盖
- 添加测试覆盖、CI 门控或回归保护
- 配置 CMake/CTest 工作流以实现一致的执行
- 调查测试失败或偶发性行为
- 启用用于内存/竞态诊断的消毒剂
不适用时机
- 在不修改测试的情况下实现新的产品功能
- 与测试覆盖或失败无关的大规模重构
- 没有测试回归需要验证的性能调优
- 非 C++ 项目或非测试任务
核心概念
- TDD 循环:红 → 绿 → 重构(先写测试,最小化修复,然后清理)。
- 隔离:优先使用依赖注入和仿制品,而非全局状态。
- 测试布局:
tests/unit、tests/integration、tests/testdata。 - Mock 与 Fake:Mock 用于交互,Fake 用于有状态行为。
- CTest 发现:使用
gtest_discover_tests()进行稳定的测试发现。 - CI 信号:先运行子集,然后使用
--output-on-failure运行完整套件。
TDD 工作流
遵循 RED → GREEN → REFACTOR 循环:
- RED:编写一个捕获新行为的失败测试
- GREEN:实现最小的更改以使其通过
- REFACTOR:在测试保持通过的同时进行清理
// tests/add_test.cpp
#include <gtest/gtest.h>
int Add(int a, int b); // Provided by production code.
TEST(AddTest, AddsTwoNumbers) { // RED
EXPECT_EQ(Add(2, 3), 5);
}
// src/add.cpp
int Add(int a, int b) { // GREEN
return a + b;
}
// REFACTOR: simplify/rename once tests pass
代码示例
基础单元测试 (gtest)
// tests/calculator_test.cpp
#include <gtest/gtest.h>
int Add(int a, int b); // Provided by production code.
TEST(CalculatorTest, AddsTwo…