SuperAPI AI 工具集

cpp-testing

测试与质量

查看项目

更新于 10-15 10:54

技能介绍

用途

cpp-testing 是一个面向现代 C++(C++17/20)的智能体测试工作流技能,使用 GoogleTest/GoogleMock 配合 CMake/CTest。它用于在以下场景中提供指导:编写新的 C++ 测试或修复现有测试;为 C++ 组件设计单元/集成测试覆盖;添加测试覆盖率、CI 门禁或回归保护;配置 CMake/CTest 工作流以保证一致执行;调查测试失败或不稳定行为;启用 sanitizer 进行内存/竞态诊断。

该技能明确不适用于:实现不涉及测试变更的新产品功能;与测试覆盖或失败无关的大规模重构;没有测试回归验证的性能调优;非 C++ 项目或非测试任务。

主要能力

技能围绕 TDD 循环(红 → 绿 → 重构)组织:先写失败测试捕获新行为,再实现最小改动使其通过,最后在测试保持绿色的前提下清理代码。核心概念包括:隔离(优先依赖注入和 fake 而非全局状态);测试布局(tests/unit、tests/integration、tests/testdata);mock 与 fake 的区分(mock 用于交互,fake 用于有状态行为);CTest 发现(使用 gtest_discover_tests() 实现稳定测试发现);CI 信号(先运行子集,再用 --output-on-failure 运行完整套件)。

资料提供了基础单元测试、fixture 和 gmock 的代码示例。基础单元测试展示 TEST 宏与 EXPECT_EQ 的用法;fixture 示例展示 ::testing::Test 派生类、SetUp 中创建 UserStore 并 Seed 数据,以及 TEST_F 中查找用户;gmock 示例展示 MockNotifier 通过 MOCK_METHOD 覆写 Send,并用 EXPECT_CALL 验证 Service::Publish 调用通知。

使用方式

CMake/CTest 快速上手:CMakeLists.txt 中设置 C++20 标准,通过 FetchContent 引入 googletest(示例使用 v1.17.0,并提示按项目策略调整),添加测试可执行文件并链接 GTest::gtest、GTest::gmock、GTest::gtest_main,启用 enable_testing()、include(GoogleTest) 和 gtest_discover_tests()。构建与运行命令为:cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug;cmake --build build -j;ctest --test-dir build --output-on-failure。

运行测试可使用 ctest --test-dir build --output-on-failure,或用 -R 按名称过滤(如 -R ClampTest、-R "UserStoreTest.")。也可直接运行测试二进制并配合 --gtest_filter,如 ./build/example_tests --gtest_filter=ClampTest. 或 ./build/example_tests --gtest_filter=UserStoreTest.FindsExistingUser。

调试失败时:用 gtest filter 重跑单个失败测试;在失败断言周围添加作用域日志;启用 sanitizer 重跑;根因修复后扩展到完整套件。

覆盖率方面,建议使用目标级设置而非全局标志。通过 ENABLE_COVERAGE 选项,GNU 编译器使用 --coverage,Clang 使用 -fprofile-instr-generate -fcoverage-mapping。GCC + gcov + lcov 流程: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;lcov --remove coverage.info '/usr/*' --output-file coverage.info;genhtml coverage.info --output-directory coverage。Clang + llvm-cov 流程:cmake -S . -B build-llvm -DENABLE_COVERAGE=ON -DCMAKE_CXX_COMPILER=clang++;cmake --build build-llvm -j;LLVM_PROFILE_FILE="build-llvm/default.profraw" ctest --test-dir build-llvm;llvm-profdata merge -sparse build-llvm/default.profraw -o build-llvm/default.profdata;llvm-cov report build-llvm/example_tests -instr-profile=build-llvm/default.profdata。

Sanitizer 通过 ENABLE_ASAN、ENABLE_UBSAN、ENABLE_TSAN 选项启用,分别添加 -fsanitize=address、-fsanitize=undefined、-fsanitize=thread 编译与链接选项,ASan 和 UBSan 还添加 -fno-omit-frame-pointer。

适用场景

适用于 C++ 项目的测试编写与维护、CI 测试门禁配置、覆盖率与 sanitizer 集成、失败与不稳定测试诊断。资料还包含不稳定测试防护准则:不要用 sleep 做同步,应使用条件变量或 latch;临时目录按测试唯一并始终清理;单元测试避免真实时间、网络或文件系统依赖;随机输入使用确定性种子。

最佳实践方面,建议保持测试确定性和隔离,优先依赖注入而非全局变量,前置条件用 ASSERT_、多重检查用 EXPECT_,在 CTest 标签或目录中区分单元与集成测试,在 CI 中运行 sanitizer 检测内存和竞态。不建议在单元测试中依赖真实时间或网络,不用 sleep 作为同步手段,不过度 mock 简单值对象,不对非关键日志使用脆弱的字符串匹配。

常见陷阱包括:使用固定临时路径、依赖墙上时钟时间、不稳定的并发测试、隐藏的全局状态、过度 mock、缺少 sanitizer 运行、仅在 debug 构建上做覆盖率。

限制

资料中可选附录提到模糊测试/属性测试,仅在项目已支持 LLVM/libFuzzer 或属性测试库时使用;libFuzzer 最适合 I/O 极少的纯函数,RapidCheck 用于验证不变量的属性测试,并给出最小 libFuzzer harness 伪代码。GoogleTest 的替代方案包括 Catch2(header-only、表达力强的匹配器)和 doctest(轻量、编译开销小)。关于该技能的收费、价格、平台支持范围等事实,资料中暂未提供。