Appearance
Claude Code 的 cpp-testing Skill 是专为现代 C++(C++17/20)项目打造的测试自动化体系,聚焦 GoogleTest/GoogleMock 与 CMake/CTest 的高效集成。它解决了测试用例编写、测试配置、覆盖率统计、Sanitizer 内存/并发诊断等痛点,显著提升 AI 辅助 C++ 编程下的测试可靠性和开发效率。Skill 支持 TDD 流程、Mock/Fake 管理、CI 集成与常见陷阱防护,适用于新建、维护、诊断和提升 C++ 测试体系的全周期场景。
Everything Claude Code C++ Testing Skill:GoogleTest/CTest 配置、覆盖率与 Sanitizers 测试体系
在 AI 编程助手(如 Claude Code、Codex、Cursor)辅助下,C++ 测试体系的自动化和规范化成为生产级开发的关键环节。cpp-testing Skill 正是为此场景设计,结合 GoogleTest/GoogleMock、CMake/CTest、覆盖率统计与 Sanitizer 工具,构建一套可持续演进的 C++ 测试工作流。
本指南将详细介绍 cpp-testing Skill 的应用场景、触发条件、分步操作流程、输出示例,以及与其他 Agent/Skill 的协作关系,帮助你在实际项目中用好这一 Skill,打造高可靠、低维护成本的 C++ 测试体系。
1. 这个 Skill 解决什么问题?
传统 C++ 测试的痛点:
- 手动配置 GoogleTest/CTest 易出错,环境不一致
- 覆盖率统计与 Sanitizer 配置复杂,CI 集成困难
- 测试用例分布混乱,Mock/Fake 滥用或缺失
- 单元/集成测试难以区分,Flaky test 难以定位
- 新手难以掌握 TDD 流程和最佳实践
cpp-testing Skill 的优势:
- 一键生成/修复 GoogleTest/CTest 测试用例与配置
- 自动添加覆盖率与 Sanitizer 支持,提升回归与内存安全保障
- 指导 TDD 流程(Red-Green-Refactor),输出结构化测试代码
- Mock/Fake/Fixture 规范化,避免常见测试陷阱
- 支持 CI/CD 下的测试分层、标签与输出优化
- 结合 C++ Reviewer Agent、C++ Build Resolver 等,形成完整的 AI 测试/修复闭环
2. 触发条件与激活时机
自动激活场景:
- 新增/修改 C++ 测试用例(tests/ 目录下 *.cpp 文件)
- 配置或修复 GoogleTest/CTest 测试框架
- 需要为 C++ 组件补充测试覆盖率或引入回归保护
- 检查、定位、修复失败或不稳定(flaky)的 C++ 测试
- 添加 AddressSanitizer、UBSan、TSan 等内存/并发诊断
- 需要 CI/CD 下的测试分层与输出优化
不会激活的场景:
- 纯业务代码开发,无测试相关变更
- 非 C++ 项目或与测试无关的重构/优化
- 性能调优但无测试回归需求
3. Step by Step:实际项目中的使用流程
Step 1:新建/修复 C++ 测试用例
Skill 会自动识别 tests/unit、tests/integration 等目录结构,生成或修复 GoogleTest/GoogleMock 测试代码,推荐如下分层:
tests/unit/:单元测试tests/integration/:集成测试tests/testdata/:测试数据
示例:新建加法函数单元测试
cpp
// tests/add_test.cpp
#include <gtest/gtest.h>
int Add(int a, int b); // Production code
TEST(AddTest, AddsTwoNumbers) { // RED
EXPECT_EQ(Add(2, 3), 5);
}Skill 会提示你先写 RED(失败)测试,再实现最小通过代码(GREEN),最后重构(REFACTOR),完整 TDD 流程如下:
cpp
// src/add.cpp
int Add(int a, int b) { // GREEN
return a + b;
}Step 2:引入 Fixture、Mock、Fake
Skill 根据依赖关系自动建议使用 Fixture(测试夹具)、Mock(交互)、Fake(状态模拟):
Fixture 示例:
cpp
class UserStoreTest : public ::testing::Test {
protected:
void SetUp() override {
store = std::make_unique<UserStore>(":memory:");
store->Seed({{"alice"}, {"bob"}});
}
std::unique_ptr<UserStore> store;
};
TEST_F(UserStoreTest, FindsExistingUser) {
auto user = store->Find("alice");
ASSERT_TRUE(user.has_value());
EXPECT_EQ(user->name, "alice");
}Mock 示例:
cpp
class MockNotifier : public Notifier {
public:
MOCK_METHOD(void, Send, (const std::string &message), (override));
};
TEST(ServiceTest, SendsNotifications) {
MockNotifier notifier;
Service service(notifier);
EXPECT_CALL(notifier, Send("hello")).Times(1);
service.Publish("hello");
}Step 3:CMake/CTest 配置自动化
Skill 会生成/修复标准 CMakeLists.txt 片段,实现 GoogleTest/CTest 集成与自动发现:
cmake
include(FetchContent)
set(GTEST_VERSION v1.17.0)
FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/refs/tags/${GTEST_VERSION}.zip
)
FetchContent_MakeAvailable(googletest)
add_executable(example_tests
tests/calculator_test.cpp
src/calculator.cpp
)
target_link_libraries(example_tests GTest::gtest GTest::gmock GTest::gtest_main)
enable_testing()
include(GoogleTest)
gtest_discover_tests(example_tests)一键构建与运行:
bash
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
cmake --build build -j
ctest --test-dir build --output-on-failureStep 4:覆盖率与 Sanitizer 支持
Skill 自动为测试目标添加覆盖率和 Sanitizer 选项,支持 GCC/Clang:
覆盖率配置(GCC/gcov/lcov):
cmake
option(ENABLE_COVERAGE "Enable coverage flags" OFF)
if(ENABLE_COVERAGE)
target_compile_options(example_tests PRIVATE --coverage)
target_link_options(example_tests PRIVATE --coverage)
endif()生成覆盖率报告:
bash
cmake -S . -B build-cov -DENABLE_COVERAGE=ON
cmake --build build-cov -j
ctest --test-dir build-cov
lcov --capture --directory build-cov --output-file coverage.info
genhtml coverage.info --output-directory coverageSanitizer 配置:
cmake
option(ENABLE_ASAN "Enable AddressSanitizer" OFF)
if(ENABLE_ASAN)
add_compile_options(-fsanitize=address -fno-omit-frame-pointer)
add_link_options(-fsanitize=address)
endif()Skill 会建议在 CI 中分别开启 ASan、UBSan、TSan 构建,提升内存和并发安全。
Step 5:诊断失败与 Flaky 测试
- Skill 提示用 gtest filter 精确复现失败用例
- 自动插入日志、建议用条件变量替代 sleep
- 检查是否存在全局状态、固定路径、真实网络/时钟依赖
- 推荐每个测试用唯一临时目录并自动清理
Step 6:CI/CD 集成与最佳实践
- Skill 指导用 CTest label 或目录区分单元/集成测试
- 输出建议:先跑核心子集,后跑全量(提升 CI 信号)
- 强制覆盖率与 Sanitizer 通过才允许合并(TDD 闭环)
- 推荐与 Verification Loop Skill 结合,形成端到端自动验证
4. Skill 输出示例
典型输出:
- 新增测试用例代码片段(带注释)
- 完整 CMake/CTest 配置,带覆盖率/ASan 选项
- 针对失败测试的诊断建议(如日志插入、Mock/Fake 优化)
- CI 测试分层与标签配置建议
- 常见陷阱检测报告(如全局状态、sleep、固定路径)
5. 常见配套 Agent/Skill 协作
- C++ Reviewer Agent:自动审查测试代码的内存安全、现代 C++ 惯用法
- C++ Build Resolver:精准修复 CMake、链接器、模板相关构建错误
- Verification Loop Skill:自动化端到端测试验证循环
- TDD Guide Agent:强制测试先行、覆盖率达标的开发流程
- Python Testing Skill、Rust Testing Skill:跨语言测试体系对齐与最佳实践迁移
6. 常见问题与注意事项
常见陷阱
- 不要在单元测试中依赖真实时间、网络、文件系统
- 不要用 sleep 实现同步,优先用条件变量或 latch
- 不要在测试中滥用 Mock,简单对象用 Fake 或真实实现
- 每个测试用唯一临时目录,避免并发冲突
Skill 使用建议
- 优先按 Skill 推荐目录结构组织测试
- 覆盖率与 Sanitizer 选项应随目标开启,避免全局污染
- CI 下建议分层跑测试,提升反馈速度
- 定期用 Skill 检查测试稳定性与覆盖率
FAQ
Q: cpp-testing Skill 支持哪些 C++ 测试框架? A: 主要支持 GoogleTest/GoogleMock,兼容 CMake/CTest,部分建议可迁移到 Catch2/doctest 等轻量框架。
Q: 如何用 Skill 自动检测和修复 Flaky 测试? A: Skill 会提示用条件变量替代 sleep、唯一化临时目录、避免全局状态,并输出诊断建议和修复代码片段。
Q: 覆盖率和 Sanitizer 怎么集成到 CI? A: Skill 会生成带 ENABLE_COVERAGE/ENABLE_ASAN 等选项的 CMake 配置,建议在 CI 脚本中分别构建并强制通过才合并。