Skip to content

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 AgentC++ 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-failure

Step 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 coverage

Sanitizer 配置:

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 协作

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 脚本中分别构建并强制通过才合并。