[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6JCTWN1Q6P8C7EBEWW8K1Y3":3,"skill-same:01M6JCTWN1Q6P8C7EBEWW8K1Y3":64},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":25,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":42,"commitSha":43,"skillDirectory":44,"forksCount":45,"repositoryHtmlUrl":46,"repositoryHomepageUrl":47,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":49,"install":50,"resources":63},"01M6JCTWN1Q6P8C7EBEWW8K1Y3","cpp-testing",null,"Use only when writing\u002Fupdating\u002Ffixing C++ tests, configuring GoogleTest\u002FCTest, diagnosing failing or flaky tests, or adding coverage\u002Fsanitizers.","S3YED\u002Fappie-kit","S3YED","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F62743867?v=4","01M6JBKBRRVP6KMS0VWZ27T3R6","01M6JBKBX0KG30284PW1DBYJT1",14,"MIT","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fecc\u002Fcpp-testing\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[26,27,28,29,30,31,32,33,34,35],"testing","cpp","cpp testing","writing","ctest","coverage","use","only","c++","tests","2026-11-10 10:12:30",false,"---\nname: cpp-testing\ndescription: Use only when writing\u002Fupdating\u002Ffixing C++ tests, configuring GoogleTest\u002FCTest, diagnosing failing or flaky tests, or adding coverage\u002Fsanitizers.\norigin: ECC\n---\n\n# C++ Testing (Agent Skill)\n\nAgent-focused testing workflow for modern C++ (C++17\u002F20) using GoogleTest\u002FGoogleMock with CMake\u002FCTest.\n\n## When to Use\n\n- Writing new C++ tests or fixing existing tests\n- Designing unit\u002Fintegration test coverage for C++ components\n- Adding test coverage, CI gating, or regression protection\n- Configuring CMake\u002FCTest workflows for consistent execution\n- Investigating test failures or flaky behavior\n- Enabling sanitizers for memory\u002Frace diagnostics\n\n### When NOT to Use\n\n- Implementing new product features without test changes\n- Large-scale refactors unrelated to test coverage or failures\n- Performance tuning without test regressions to validate\n- Non-C++ projects or non-test tasks\n\n## Core Concepts\n\n- **TDD loop**: red → green → refactor (tests first, minimal fix, then cleanups).\n- **Isolation**: prefer dependency injection and fakes over global state.\n- **Test layout**: `tests\u002Funit`, `tests\u002Fintegration`, `tests\u002Ftestdata`.\n- **Mocks vs fakes**: mock for interactions, fake for stateful behavior.\n- **CTest discovery**: use `gtest_discover_tests()` for stable test discovery.\n- **CI signal**: run subset first, then full suite with `--output-on-failure`.\n\n## TDD Workflow\n\nFollow the RED → GREEN → REFACTOR loop:\n\n1. **RED**: write a failing test that captures the new behavior\n2. **GREEN**: implement the smallest change to pass\n3. **REFACTOR**: clean up while tests stay green\n\n```cpp\n\u002F\u002F tests\u002Fadd_test.cpp\n#include \u003Cgtest\u002Fgtest.h>\n\nint Add(int a, int b); \u002F\u002F Provided by production code.\n\nTEST(AddTest, AddsTwoNumbers) { \u002F\u002F RED\n  EXPECT_EQ(Add(2, 3), 5);\n}\n\n\u002F\u002F src\u002Fadd.cpp\nint Add(int a, int b) { \u002F\u002F GREEN\n  return a + b;\n}\n\n\u002F\u002F REFACTOR: simplify\u002Frename once tests pass\n```\n\n## Code Examples\n\n### Basic Unit Test (gtest)\n\n```cpp\n\u002F\u002F tests\u002Fcalculator_test.cpp\n#include \u003Cgtest\u002Fgtest.h>\n\nint Add(int a, int b); \u002F\u002F Provided by production code.\n\nTEST(CalculatorTest, AddsTwoNumbers) {\n    EXPECT_EQ(Add(2, 3), 5);\n}\n```\n\n### Fixture (gtest)\n\n```cpp\n\u002F\u002F tests\u002Fuser_store_test.cpp\n\u002F\u002F Pseudocode stub: replace UserStore\u002FUser with project types.\n#include \u003Cgtest\u002Fgtest.h>\n#include \u003Cmemory>\n#include \u003Coptional>\n#include \u003Cstring>\n\nstruct User { std::string name; };\nclass UserStore {\npublic:\n    explicit UserStore(std::string \u002F*path*\u002F) {}\n    void Seed(std::initializer_list\u003CUser> \u002F*users*\u002F) {}\n    std::optional\u003CUser> Find(const std::string &\u002F*name*\u002F) { return User{\"alice\"}; }\n};\n\nclass UserStoreTest : public ::testing::Test {\nprotected:\n    void SetUp() override {\n        store = std::make_unique\u003CUserStore>(\":memory:\");\n        store->Seed({{\"alice\"}, {\"bob\"}});\n    }\n\n    std::unique_ptr\u003CUserStore> store;\n};\n\nTEST_F(UserStoreTest, FindsExistingUser) {\n    auto user = store->Find(\"alice\");\n    ASSERT_TRUE(user.has_value());\n    EXPECT_EQ(user->name, \"alice\");\n}\n```\n\n### Mock (gmock)\n\n```cpp\n\u002F\u002F tests\u002Fnotifier_test.cpp\n#include \u003Cgmock\u002Fgmock.h>\n#include \u003Cgtest\u002Fgtest.h>\n#include \u003Cstring>\n\nclass Notifier {\npublic:\n    virtual ~Notifier() = default;\n    virtual void Send(const std::string &message) = 0;\n};\n\nclass MockNotifier : public Notifier {\npublic:\n    MOCK_METHOD(void, Send, (const std::string &message), (override));\n};\n\nclass Service {\npublic:\n    explicit Service(Notifier &notifier) : notifier_(notifier) {}\n    void Publish(const std::string &message) { notifier_.Send(message); }\n\nprivate:\n    Notifier &notifier_;\n};\n\nTEST(ServiceTest, SendsNotifications) {\n    MockNotifier notifier;\n    Service service(notifier);\n\n    EXPECT_CALL(notifier, Send(\"hello\")).Times(1);\n    service.Publish(\"hello\");\n}\n```\n\n### CMake\u002FCTest Quickstart\n\n```cmake\n# CMakeLists.txt (excerpt)\ncmake_minimum_required(VERSION 3.20)\nproject(example LANGUAGES CXX)\n\nset(CMAKE_CXX_STANDARD 20)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\ninclude(FetchContent)\n# Prefer project-locked versions. If using a tag, use a pinned version per project policy.\nset(GTEST_VERSION v1.17.0) # Adjust to project policy.\nFetchContent_Declare(\n  googletest\n  # Google Test framework (official repository)\n  URL https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fgoogletest\u002Farchive\u002Frefs\u002Ftags\u002F${GTEST_VERSION}.zip\n)\nFetchContent_MakeAvailable(googletest)\n\nadd_executable(example_tests\n  tests\u002Fcalculator_test.cpp\n  src\u002Fcalculator.cpp\n)\ntarget_link_libraries(example_tests GTest::gtest GTest::gmock GTest::gtest_main)\n\nenable_testing()\ninclude(GoogleTest)\ngtest_discover_tests(example_tests)\n```\n\n```bash\ncmake -S . -B build -DCMAKE_BUILD_TYPE=Debug\ncmake --build build -j\nctest --test-dir build --output-on-failure\n```\n\n## Running Tests\n\n```bash\nctest --test-dir build --output-on-failure\nctest --test-dir build -R ClampTest\nctest --test-dir build -R \"UserStoreTest.*\" --output-on-failure\n```\n\n```bash\n.\u002Fbuild\u002Fexample_tests --gtest_filter=ClampTest.*\n.\u002Fbuild\u002Fexample_tests --gtest_filter=UserStoreTest.FindsExistingUser\n```\n\n## Debugging Failures\n\n1. Re-run the single failing test with gtest filter.\n2. Add scoped logging around the failing assertion.\n3. Re-run with sanitizers enabled.\n4. Expand to full suite once the root cause is fixed.\n\n## Coverage\n\nPrefer target-level settings instead of global flags.\n\n```cmake\noption(ENABLE_COVERAGE \"Enable coverage flags\" OFF)\n\nif(ENABLE_COVERAGE)\n  if(CMAKE_CXX_COMPILER_ID MATCHES \"GNU\")\n    target_compile_options(example_tests PRIVATE --coverage)\n    target_link_options(example_tests PRIVATE --coverage)\n  elseif(CMAKE_CXX_COMPILER_ID MATCHES \"Clang\")\n    target_compile_options(example_tests PRIVATE -fprofile-instr-generate -fcoverage-mapping)\n    target_link_options(example_tests PRIVATE -fprofile-instr-generate)\n  endif()\nendif()\n```\n\nGCC + gcov + lcov:\n\n```bash\ncmake -S . -B build-cov -DENABLE_COVERAGE=ON\ncmake --build build-cov -j\nctest --test-dir build-cov\nlcov --capture --directory build-cov --output-file coverage.info\nlcov --remove coverage.info '\u002Fusr\u002F*' --output-file coverage.info\ngenhtml coverage.info --output-directory coverage\n```\n\nClang + llvm-cov:\n\n```bash\ncmake -S . -B build-llvm -DENABLE_COVERAGE=ON -DCMAKE_CXX_COMPILER=clang++\ncmake --build build-llvm -j\nLLVM_PROFILE_FILE=\"build-llvm\u002Fdefault.profraw\" ctest --test-dir build-llvm\nllvm-profdata merge -sparse build-llvm\u002Fdefault.profraw -o build-llvm\u002Fdefault.profdata\nllvm-cov report build-llvm\u002Fexample_tests -instr-profile=build-llvm\u002Fdefault.profdata\n```\n\n## Sanitizers\n\n```cmake\noption(ENABLE_ASAN \"Enable AddressSanitizer\" OFF)\noption(ENABLE_UBSAN \"Enable UndefinedBehaviorSanitizer\" OFF)\noption(ENABLE_TSAN \"Enable ThreadSanitizer\" OFF)\n\nif(ENABLE_ASAN)\n  add_compile_options(-fsanitize=address -fno-omit-frame-pointer)\n  add_link_options(-fsanitize=address)\nendif()\nif(ENABLE_UBSAN)\n  add_compile_options(-fsanitize=undefined -fno-omit-frame-pointer)\n  add_link_options(-fsanitize=undefined)\nendif()\nif(ENABLE_TSAN)\n  add_compile_options(-fsanitize=thread)\n  add_link_options(-fsanitize=thread)\nendif()\n```\n\n## Flaky Tests Guardrails\n\n- Never use `sleep` for synchronization; use condition variables or latches.\n- Make temp directories unique per test and always clean them.\n- Avoid real time, network, or filesystem dependencies in unit tests.\n- Use deterministic seeds for randomized inputs.\n\n## Best Practices\n\n### DO\n\n- Keep tests deterministic and isolated\n- Prefer dependency injection over globals\n- Use `ASSERT_*` for preconditions, `EXPECT_*` for multiple checks\n- Separate unit vs integration tests in CTest labels or directories\n- Run sanitizers in CI for memory and race detection\n\n### DON'T\n\n- Don't depend on real time or network in unit tests\n- Don't use sleeps as synchronization when a condition variable can be used\n- Don't over-mock simple value objects\n- Don't use brittle string matching for non-critical logs\n\n### Common Pitfalls\n\n- **Using fixed temp paths** → Generate unique temp directories per test and clean them.\n- **Relying on wall clock time** → Inject a clock or use fake time sources.\n- **Flaky concurrency tests** → Use condition variables\u002Flatches and bounded waits.\n- **Hidden global state** → Reset global state in fixtures or remove globals.\n- **Over-mocking** → Prefer fakes for stateful behavior and only mock interactions.\n- **Missing sanitizer runs** → Add ASan\u002FUBSan\u002FTSan builds in CI.\n- **Coverage on debug-only builds** → Ensure coverage targets use consistent flags.\n\n## Optional Appendix: Fuzzing \u002F Property Testing\n\nOnly use if the project already supports LLVM\u002FlibFuzzer or a property-testing library.\n\n- **libFuzzer**: best for pure functions with minimal I\u002FO.\n- **RapidCheck**: property-based tests to validate invariants.\n\nMinimal libFuzzer harness (pseudocode: replace ParseConfig):\n\n```cpp\n#include \u003Ccstddef>\n#include \u003Ccstdint>\n#include \u003Cstring>\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {\n    std::string input(reinterpret_cast\u003Cconst char *>(data), size);\n    \u002F\u002F ParseConfig(input); \u002F\u002F project function\n    return 0;\n}\n```\n\n## Alternatives to GoogleTest\n\n- **Catch2**: header-only, expressive matchers\n- **doctest**: lightweight, minimal compile overhead\n","# C++ Testing (Agent Skill)\n\nAgent-focused testing workflow for modern C++ (C++17\u002F20) using GoogleTest\u002FGoogleMock with CMake\u002FCTest.\n\n## When to Use\n\n- Writing new C++ tests or fixing existing tests\n- Designing unit\u002Fintegration test coverage for C++ components\n- Adding test coverage, CI gating, or regression protection\n- Configuring CMake\u002FCTest workflows for consistent execution\n- Investigating test failures or flaky behavior\n- Enabling sanitizers for memory\u002Frace diagnostics\n\n### When NOT to Use\n\n- Implementing new product features without test changes\n- Large-scale refactors unrelated to test coverage or failures\n- Performance tuning without test regressions to validate\n- Non-C++ projects or non-test tasks\n\n## Core Concepts\n\n- **TDD loop**: red → green → refactor (tests first, minimal fix, then cleanups).\n- **Isolation**: prefer dependency injection and fakes over global state.\n- **Test layout**: `tests\u002Funit`, `tests\u002Fintegration`, `tests\u002Ftestdata`.\n- **Mocks vs fakes**: mock for interactions, fake for stateful behavior.\n- **CTest discovery**: use `gtest_discover_tests()` for stable test discovery.\n- **CI signal**: run subset first, then full suite with `--output-on-failure`.\n\n## TDD Workflow\n\nFollow the RED → GREEN → REFACTOR loop:\n\n1. **RED**: write a failing test that captures the new behavior\n2. **GREEN**: implement the smallest change to pass\n3. **REFACTOR**: clean up while tests stay green\n\n```cpp\n\u002F\u002F tests\u002Fadd_test.cpp\n#include \u003Cgtest\u002Fgtest.h>\n\nint Add(int a, int b); \u002F\u002F Provided by production code.\n\nTEST(AddTest, AddsTwoNumbers) { \u002F\u002F RED\n  EXPECT_EQ(Add(2, 3), 5);\n}\n\n\u002F\u002F src\u002Fadd.cpp\nint Add(int a, int b) { \u002F\u002F GREEN\n  return a + b;\n}\n\n\u002F\u002F REFACTOR: simplify\u002Frename once tests pass\n```\n\n## Code Examples\n\n### Basic Unit Test (gtest)\n\n```cpp\n\u002F\u002F tests\u002Fcalculator_test.cpp\n#include \u003Cgtest\u002Fgtest.h>\n\nint Add(int a, int b); \u002F\u002F Provided by production code.\n\nTEST(CalculatorTest, AddsTwoNumbers) {\n    EXPECT_EQ(Add(2, 3), 5);\n}\n```\n\n### Fixture (gtest)\n\n```cpp\n\u002F\u002F tests\u002Fuser_store_test.cpp\n\u002F\u002F Pseudocode stub: replace UserStore\u002FUser with project types.\n#include \u003Cgtest\u002Fgtest.h>\n#include \u003Cmemory>\n#include \u003Coptional>\n#include \u003Cstring>\n\nstruct User { std::string name; };\nclass UserStore {\npublic:\n    explicit UserStore(std::string \u002F*path*\u002F) {}\n    void Seed(std::initializer_list\u003CUser> \u002F*users*\u002F) {}\n    std::optional\u003CUser> Find(const std::string &\u002F*name*\u002F) { return User{\"alice\"}; }\n};\n\nclass UserStoreTest : public ::testing::Test {\nprotected:\n    void SetUp() override {\n        store = std::make_unique\u003CUserStore>(\":memory:\");\n        store->Seed({{\"alice\"}, {\"bob\"}});\n    }\n\n    std::unique_ptr\u003CUserStore> store;\n};\n\nTEST_F(UserStoreTest, FindsExistingUser) {\n    auto user = store->Find(\"alice\");\n    ASSERT_TRUE(user.has_value());\n    EXPECT_EQ(user->name, \"alice\");\n}\n```\n\n### Mock (gmock)\n\n```cpp\n\u002F\u002F tests\u002Fnotifier_test.cpp\n#include \u003Cgmock\u002Fgmock.h>\n#include \u003Cgtest\u002Fgtest.h>\n#include \u003Cstring>\n\nclass Notifier {\npublic:\n    virtual ~Notifier() = default;\n    virtual void Send(const std::string &message) = 0;\n};\n\nclass MockNotifier : public Notifier {\npublic:\n    MOCK_METHOD(void, Send, (const std::string &message), (override));\n};\n\nclass Service {\npublic:\n    explicit Service(Notifier &notifier) : notifier_(notifier) {}\n    void Publish(const std::string &message) { notifier_.Send(message); }\n\nprivate:\n    Notifier &notifier_;\n};\n\nTEST(ServiceTest, SendsNotifications) {\n    MockNotifier notifier;\n    Service service(notifier);\n\n    EXPECT_CALL(notifier, Send(\"hello\")).Times(1);\n    service.Publish(\"hello\");\n}\n```\n\n### CMake\u002FCTest Quickstart\n\n```cmake\n# CMakeLists.txt (excerpt)\ncmake_minimum_required(VERSION 3.20)\nproject(example LANGUAGES CXX)\n\nset(CMAKE_CXX_STANDARD 20)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\ninclude(FetchContent)\n# Prefer project-locked versions. If using a tag, use a pinned version per project policy.\nset(GTEST_VERSION v1.17.0) # Adjust to project policy.\nFetchContent_Declare(\n  googletest\n  # Google Test framework (official repository)\n  URL https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fgoogletest\u002Farchive\u002Frefs\u002Ftags\u002F${GTEST_VERSION}.zip\n)\nFetchContent_MakeAvailable(googletest)\n\nadd_executable(example_tests\n  tests\u002Fcalculator_test.cpp\n  src\u002Fcalculator.cpp\n)\ntarget_link_libraries(example_tests GTest::gtest GTest::gmock GTest::gtest_main)\n\nenable_testing()\ninclude(GoogleTest)\ngtest_discover_tests(example_tests)\n```\n\n```bash\ncmake -S . -B build -DCMAKE_BUILD_TYPE=Debug\ncmake --build build -j\nctest --test-dir build --output-on-failure\n```\n\n## Running Tests\n\n```bash\nctest --test-dir build --output-on-failure\nctest --test-dir build -R ClampTest\nctest --test-dir build -R \"UserStoreTest.*\" --output-on-failure\n```\n\n```bash\n.\u002Fbuild\u002Fexample_tests --gtest_filter=ClampTest.*\n.\u002Fbuild\u002Fexample_tests --gtest_filter=UserStoreTest.FindsExistingUser\n```\n\n## Debugging Failures\n\n1. Re-run the single failing test with gtest filter.\n2. Add scoped logging around the failing assertion.\n3. Re-run with sanitizers enabled.\n4. Expand to full suite once the root cause is fixed.\n\n## Coverage\n\nPrefer target-level settings instead of global flags.\n\n```cmake\noption(ENABLE_COVERAGE \"Enable coverage flags\" OFF)\n\nif(ENABLE_COVERAGE)\n  if(CMAKE_CXX_COMPILER_ID MATCHES \"GNU\")\n    target_compile_options(example_tests PRIVATE --coverage)\n    target_link_options(example_tests PRIVATE --coverage)\n  elseif(CMAKE_CXX_COMPILER_ID MATCHES \"Clang\")\n    target_compile_options(example_tests PRIVATE -fprofile-instr-generate -fcoverage-mapping)\n    target_link_options(example_tests PRIVATE -fprofile-instr-generate)\n  endif()\nendif()\n```\n\nGCC + gcov + lcov:\n\n```bash\ncmake -S . -B build-cov -DENABLE_COVERAGE=ON\ncmake --build build-cov -j\nctest --test-dir build-cov\nlcov --capture --directory build-cov --output-file coverage.info\nlcov --remove coverage.info '\u002Fusr\u002F*' --output-file coverage.info\ngenhtml coverage.info --output-directory coverage\n```\n\nClang + llvm-cov:\n\n```bash\ncmake -S . -B build-llvm -DENABLE_COVERAGE=ON -DCMAKE_CXX_COMPILER=clang++\ncmake --build build-llvm -j\nLLVM_PROFILE_FILE=\"build-llvm\u002Fdefault.profraw\" ctest --test-dir build-llvm\nllvm-profdata merge -sparse build-llvm\u002Fdefault.profraw -o build-llvm\u002Fdefault.profdata\nllvm-cov report build-llvm\u002Fexample_tests -instr-profile=build-llvm\u002Fdefault.profdata\n```\n\n## Sanitizers\n\n```cmake\noption(ENABLE_ASAN \"Enable AddressSanitizer\" OFF)\noption(ENABLE_UBSAN \"Enable UndefinedBehaviorSanitizer\" OFF)\noption(ENABLE_TSAN \"Enable ThreadSanitizer\" OFF)\n\nif(ENABLE_ASAN)\n  add_compile_options(-fsanitize=address -fno-omit-frame-pointer)\n  add_link_options(-fsanitize=address)\nendif()\nif(ENABLE_UBSAN)\n  add_compile_options(-fsanitize=undefined -fno-omit-frame-pointer)\n  add_link_options(-fsanitize=undefined)\nendif()\nif(ENABLE_TSAN)\n  add_compile_options(-fsanitize=thread)\n  add_link_options(-fsanitize=thread)\nendif()\n```\n\n## Flaky Tests Guardrails\n\n- Never use `sleep` for synchronization; use condition variables or latches.\n- Make temp directories unique per test and always clean them.\n- Avoid real time, network, or filesystem dependencies in unit tests.\n- Use deterministic seeds for randomized inputs.\n\n## Best Practices\n\n### DO\n\n- Keep tests deterministic and isolated\n- Prefer dependency injection over globals\n- Use `ASSERT_*` for preconditions, `EXPECT_*` for multiple checks\n- Separate unit vs integration tests in CTest labels or directories\n- Run sanitizers in CI for memory and race detection\n\n### DON'T\n\n- Don't depend on real time or network in unit tests\n- Don't use sleeps as synchronization when a condition variable can be used\n- Don't over-mock simple value objects\n- Don't use brittle string matching for non-critical logs\n\n### Common Pitfalls\n\n- **Using fixed temp paths** → Generate unique temp directories per test and clean them.\n- **Relying on wall clock time** → Inject a clock or use fake time sources.\n- **Flaky concurrency tests** → Use condition variables\u002Flatches and bounded waits.\n- **Hidden global state** → Reset global state in fixtures or remove globals.\n- **Over-mocking** → Prefer fakes for stateful behavior and only mock interactions.\n- **Missing sanitizer runs** → Add ASan\u002FUBSan\u002FTSan builds in CI.\n- **Coverage on debug-only builds** → Ensure coverage targets use consistent flags.\n\n## Optional Appendix: Fuzzing \u002F Property Testing\n\nOnly use if the project already supports LLVM\u002FlibFuzzer or a property-testing library.\n\n- **libFuzzer**: best for pure functions with minimal I\u002FO.\n- **RapidCheck**: property-based tests to validate invariants.\n\nMinimal libFuzzer harness (pseudocode: replace ParseConfig):\n\n```cpp\n#include \u003Ccstddef>\n#include \u003Ccstdint>\n#include \u003Cstring>\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {\n    std::string input(reinterpret_cast\u003Cconst char *>(data), size);\n    \u002F\u002F ParseConfig(input); \u002F\u002F project function\n    return 0;\n}\n```\n\n## Alternatives to GoogleTest\n\n- **Catch2**: header-only, expressive matchers\n- **doctest**: lightweight, minimal compile overhead\n",{"name":5,"origin":41,"description":7},"ECC","master","8ec37df6d71fb664ea19d32c079e7d3ff931a8e0","skills\u002Fecc\u002Fcpp-testing",3,"https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit","https:\u002F\u002Fweblyfe.ai","https:\u002F\u002Fgithub.com\u002FS3YED","2026-08-27 01:54:02",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add S3YED\u002Fappie-kit --skill cpp-testing",{"tool":56,"command":57},"bunx","bunx skills add S3YED\u002Fappie-kit --skill cpp-testing",{"tool":59,"command":60},"pnpm","pnpm dlx skills add S3YED\u002Fappie-kit --skill cpp-testing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fecc\u002Fcpp-testing\u002FSKILL.md",true,[],[65,97,132,158,189,214],{"skillNo":66,"name":67,"nameZh":6,"description":68,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":78,"publishedAt":36},"01M6JFD4M6N4DSGC7TXEJ5R3J2","ai-music","AI music generation and audio tools: HeartMuLa lyrics-to-music generation, songwriting craft (+ Suno prompts), and audio spectrogram\u002Ffeature visualization.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fwethlete\u002Fai-music\u002FSKILL.md",[71,74,77],{"categoryNo":72,"categoryName":73,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":75,"categoryName":76,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96],"music","ai music","humanizer","visualization","Tools","Audio","hermes","hermes agent","songwriting","suno","lyrics","prompts","heartmula","craft","generation","feature","ai music generation","music generation",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":111,"publishedAt":36},"01M6JFCZE4XNFQFMNZDHKHT5V5","agentic-webdesign-design-system-ingestion","Use v0 Design Systems 2.0, Bolt Design System Agents, or Lovable to generate production UI from a client's real design system components — not generic Tailwind. Use when building a client website where brand consistency matters.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-design\u002Fagentic-webdesign-design-system-ingestion\u002FSKILL.md",[103,106],{"categoryNo":104,"categoryName":105,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":107,"categoryName":108,"taxonomyType":109,"taxonomyTypeDesc":110},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131],"design","agentic","design system","system","ingestion","webdesign","agentic webdesign design system ingestion","components","generate","design systems","website","ui","Tailwind","bolt","lovable","v0","design-system","wed","design system components","appie",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":140,"publishedAt":36},"01M6JFCVPX3913CFAS6QQJ33ZB","agentic-webdesign-agent-elements","Use 21st.dev Agent Elements — 25 shadcn\u002Fui components purpose-built for AI agent UIs. Tool cards (Bash, Edit, Search, Plan, Subagent, MCP), chat, input, streaming. Open source, shadcn-registry install, no runtime lock-in.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-design\u002Fagentic-webdesign-agent-elements\u002FSKILL.md",[138,139],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":107,"categoryName":108,"taxonomyType":109,"taxonomyTypeDesc":110},[113,141,117,142,143,144,119,145,146,147,148,149,150,151,152,153,154,155,156,157],"elements","agentic webdesign agent elements","MCP","ai agent","registry","search","streaming","open source","open","Bash","plan","subagent","edit","install","input","lock","source",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":168,"publishedAt":36},"01M6JFCQC7H65M9QJ6TRE71BS1","vercel-deployment","Deploy static sites and frontends to Vercel — handles both CLI and REST API paths, including the CLI token sanitization workaround.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Fvercel-deployment\u002FSKILL.md",[164,167],{"categoryNo":165,"categoryName":166,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188],"deployment","vercel deployment","vercel","macos","cli","linux","windows","deploy","vercel deploy","REST","api","site","deploy to vercel","token","rest api","host","sites","paths","sanitization","static site",{"skillNo":190,"name":191,"nameZh":6,"description":192,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":193,"categories":194,"keywords":196,"publishedAt":36},"01M6JFCM4SMTXBM5A01BK2YQG1","software-quality-workflows","Umbrella workflow for TDD, debugging, code simplification, spikes, pre-commit review, and debugger-assisted investigation.","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Fsoftware-quality-workflows\u002FSKILL.md",[195],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213],"workflows","quality","software","software quality workflows","review","tdd","workflow","commit","debugging","code","debugger","pre-commit","investigation","code simplification","user","simplification","for",{"skillNo":215,"name":216,"nameZh":6,"description":217,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":218,"categories":219,"keywords":227,"publishedAt":36},"01M6JFCGD0M6CEATY01W7YN6DB","react-component-refactoring","Safely refactor large React components into smaller, maintainable pieces using proven patterns","https:\u002F\u002Fgithub.com\u002FS3YED\u002Fappie-kit\u002Fblob\u002Fmaster\u002Fskills\u002Fsoftware-development\u002Freact-component-refactoring\u002FSKILL.md",[220,223,226],{"categoryNo":221,"categoryName":222,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":224,"categoryName":225,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[228,229,230,231,232,233,234,29,172,235,236,119,237,175,238,206,239,240,241,242],"react","component","refactoring","component refactoring","react component","react component refactoring","frontend","safe","typescript","react components","modular","refactor","simplify","patterns","test-driven-development"]