[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6D7TXHJH4MFZDPDFMC7N0WW":3,"skill-same:01M6D7TXHJH4MFZDPDFMC7N0WW":57},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":29,"linkOnly":30,"markdownContent":31,"markdownBody":32,"frontMatter":33,"refName":34,"commitSha":35,"skillDirectory":36,"forksCount":37,"repositoryHtmlUrl":38,"repositoryHomepageUrl":6,"ownerHtmlUrl":39,"ownerBlogUrl":40,"ownerDescription":41,"updatedAt":42,"install":43,"resources":56},"01M6D7TXHJH4MFZDPDFMC7N0WW","cpp-testing",null,"C++ テストの作成\u002F更新\u002F修正、GoogleTest\u002FCTest の設定、失敗またはフレーキーなテストの診断、カバレッジ\u002Fサニタイザーの追加時にのみ使用します。","oabdelmaksoud\u002FSuperClaw","oabdelmaksoud","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F50699149?v=4","01M6D5CVVN778ZCDP1WHS816SP","Omar Abdelmaksoud","01M6D5CW1RHNSKCJR85GJACBFT",2,"MIT","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fdocs\u002Fja-JP\u002Fskills\u002Fcpp-testing\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[24,25,26,27,28],"testing","cpp","cpp testing","ctest","c++","2026-11-10 10:12:30",false,"---\nname: cpp-testing\ndescription: C++ テストの作成\u002F更新\u002F修正、GoogleTest\u002FCTest の設定、失敗またはフレーキーなテストの診断、カバレッジ\u002Fサニタイザーの追加時にのみ使用します。\n---\n\n# C++ Testing（エージェントスキル）\n\nCMake\u002FCTest を使用した GoogleTest\u002FGoogleMock による最新の C++（C++17\u002F20）向けのエージェント重視のテストワークフローです。\n\n## 使用タイミング\n\n- 新しい C++ テストの作成または既存のテストの修正\n- C++ コンポーネントのユニット\u002F統合テストカバレッジの設計\n- テストカバレッジ、CI ゲーティング、リグレッション保護の追加\n- 一貫した実行のための CMake\u002FCTest ワークフローの設定\n- テスト失敗またはフレーキーな動作の調査\n- メモリ\u002Fレース診断のためのサニタイザーの有効化\n\n### 使用すべきでない場合\n\n- テスト変更を伴わない新しい製品機能の実装\n- テストカバレッジや失敗に関連しない大規模なリファクタリング\n- 検証するテストリグレッションのないパフォーマンスチューニング\n- C++ 以外のプロジェクトまたはテスト以外のタスク\n\n## コア概念\n\n- **TDD ループ**: red → green → refactor（テスト優先、最小限の修正、その後クリーンアップ）\n- **分離**: グローバル状態よりも依存性注入とフェイクを優先\n- **テストレイアウト**: `tests\u002Funit`、`tests\u002Fintegration`、`tests\u002Ftestdata`\n- **モック vs フェイク**: 相互作用にはモック、ステートフルな動作にはフェイク\n- **CTest ディスカバリー**: 安定したテストディスカバリーのために `gtest_discover_tests()` を使用\n- **CI シグナル**: 最初にサブセットを実行し、次に `--output-on-failure` でフルスイートを実行\n\n## TDD ワークフロー\n\nRED → GREEN → REFACTOR ループに従います：\n\n1. **RED**: 新しい動作をキャプチャする失敗するテストを書く\n2. **GREEN**: 合格する最小限の変更を実装する\n3. **REFACTOR**: テストがグリーンのままクリーンアップする\n\n```cpp\n\u002F\u002F tests\u002Fadd_test.cpp\n#include \u003Cgtest\u002Fgtest.h>\n\nint Add(int a, int b); \u002F\u002F プロダクションコードによって提供されます。\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: テストが合格したら簡素化\u002F名前変更\n```\n\n## コード例\n\n### 基本的なユニットテスト（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 プロダクションコードによって提供されます。\n\nTEST(CalculatorTest, AddsTwoNumbers) {\n    EXPECT_EQ(Add(2, 3), 5);\n}\n```\n\n### フィクスチャ（gtest）\n\n```cpp\n\u002F\u002F tests\u002Fuser_store_test.cpp\n\u002F\u002F 擬似コードスタブ: UserStore\u002FUser をプロジェクトの型に置き換えてください。\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### モック（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 クイックスタート\n\n```cmake\n# CMakeLists.txt（抜粋）\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# プロジェクトロックされたバージョンを優先します。タグを使用する場合は、プロジェクトポリシーに従って固定されたバージョンを使用します。\nset(GTEST_VERSION v1.17.0) # プロジェクトポリシーに合わせて調整します。\nFetchContent_Declare(\n  googletest\n  URL Google Test framework (official repository) 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## テストの実行\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## 失敗のデバッグ\n\n1. gtest フィルタで単一の失敗したテストを再実行します。\n2. 失敗したアサーションの周りにスコープ付きログを追加します。\n3. サニタイザーを有効にして再実行します。\n4. 根本原因が修正されたら、フルスイートに拡張します。\n\n## カバレッジ\n\nグローバルフラグではなく、ターゲットレベルの設定を優先します。\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## サニタイザー\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## フレーキーテストのガードレール\n\n- 同期に `sleep` を使用しないでください。条件変数またはラッチを使用してください。\n- 一時ディレクトリをテストごとに一意にし、常にクリーンアップしてください。\n- ユニットテストで実際の時間、ネットワーク、ファイルシステムの依存関係を避けてください。\n- ランダム化された入力には決定論的シードを使用してください。\n\n## ベストプラクティス\n\n### すべきこと\n\n- テストを決定論的かつ分離されたものに保つ\n- グローバル変数よりも依存性注入を優先する\n- 前提条件には `ASSERT_*` を使用し、複数のチェックには `EXPECT_*` を使用する\n- CTest ラベルまたはディレクトリでユニットテストと統合テストを分離する\n- メモリとレース検出のために CI でサニタイザーを実行する\n\n### すべきでないこと\n\n- ユニットテストで実際の時間やネットワークに依存しない\n- 条件変数を使用できる場合、同期としてスリープを使用しない\n- 単純な値オブジェクトをオーバーモックしない\n- 重要でないログに脆弱な文字列マッチングを使用しない\n\n### よくある落とし穴\n\n- **固定一時パスの使用** → テストごとに一意の一時ディレクトリを生成し、クリーンアップします。\n- **ウォールクロック時間への依存** → クロックを注入するか、偽の時間ソースを使用します。\n- **フレーキーな並行性テスト** → 条件変数\u002Fラッチと境界付き待機を使用します。\n- **隠れたグローバル状態** → フィクスチャでグローバル状態をリセットするか、グローバル変数を削除します。\n- **オーバーモック** → ステートフルな動作にはフェイクを優先し、相互作用のみをモックします。\n- **サニタイザー実行の欠落** → CI に ASan\u002FUBSan\u002FTSan ビルドを追加します。\n- **デバッグのみのビルドでのカバレッジ** → カバレッジターゲットが一貫したフラグを使用することを確認します。\n\n## オプションの付録: ファジングとプロパティテスト\n\nプロジェクトがすでに LLVM\u002FlibFuzzer またはプロパティテストライブラリをサポートしている場合にのみ使用してください。\n\n- **libFuzzer**: 最小限の I\u002FO で純粋関数に最適です。\n- **RapidCheck**: 不変条件を検証するプロパティベースのテストです。\n\n最小限の libFuzzer ハーネス（擬似コード: 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 プロジェクト関数\n    return 0;\n}\n```\n\n## GoogleTest の代替\n\n- **Catch2**: ヘッダーオンリー、表現力豊かなマッチャー\n- **doctest**: 軽量、最小限のコンパイルオーバーヘッド\n","# C++ Testing（エージェントスキル）\n\nCMake\u002FCTest を使用した GoogleTest\u002FGoogleMock による最新の C++（C++17\u002F20）向けのエージェント重視のテストワークフローです。\n\n## 使用タイミング\n\n- 新しい C++ テストの作成または既存のテストの修正\n- C++ コンポーネントのユニット\u002F統合テストカバレッジの設計\n- テストカバレッジ、CI ゲーティング、リグレッション保護の追加\n- 一貫した実行のための CMake\u002FCTest ワークフローの設定\n- テスト失敗またはフレーキーな動作の調査\n- メモリ\u002Fレース診断のためのサニタイザーの有効化\n\n### 使用すべきでない場合\n\n- テスト変更を伴わない新しい製品機能の実装\n- テストカバレッジや失敗に関連しない大規模なリファクタリング\n- 検証するテストリグレッションのないパフォーマンスチューニング\n- C++ 以外のプロジェクトまたはテスト以外のタスク\n\n## コア概念\n\n- **TDD ループ**: red → green → refactor（テスト優先、最小限の修正、その後クリーンアップ）\n- **分離**: グローバル状態よりも依存性注入とフェイクを優先\n- **テストレイアウト**: `tests\u002Funit`、`tests\u002Fintegration`、`tests\u002Ftestdata`\n- **モック vs フェイク**: 相互作用にはモック、ステートフルな動作にはフェイク\n- **CTest ディスカバリー**: 安定したテストディスカバリーのために `gtest_discover_tests()` を使用\n- **CI シグナル**: 最初にサブセットを実行し、次に `--output-on-failure` でフルスイートを実行\n\n## TDD ワークフロー\n\nRED → GREEN → REFACTOR ループに従います：\n\n1. **RED**: 新しい動作をキャプチャする失敗するテストを書く\n2. **GREEN**: 合格する最小限の変更を実装する\n3. **REFACTOR**: テストがグリーンのままクリーンアップする\n\n```cpp\n\u002F\u002F tests\u002Fadd_test.cpp\n#include \u003Cgtest\u002Fgtest.h>\n\nint Add(int a, int b); \u002F\u002F プロダクションコードによって提供されます。\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: テストが合格したら簡素化\u002F名前変更\n```\n\n## コード例\n\n### 基本的なユニットテスト（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 プロダクションコードによって提供されます。\n\nTEST(CalculatorTest, AddsTwoNumbers) {\n    EXPECT_EQ(Add(2, 3), 5);\n}\n```\n\n### フィクスチャ（gtest）\n\n```cpp\n\u002F\u002F tests\u002Fuser_store_test.cpp\n\u002F\u002F 擬似コードスタブ: UserStore\u002FUser をプロジェクトの型に置き換えてください。\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### モック（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 クイックスタート\n\n```cmake\n# CMakeLists.txt（抜粋）\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# プロジェクトロックされたバージョンを優先します。タグを使用する場合は、プロジェクトポリシーに従って固定されたバージョンを使用します。\nset(GTEST_VERSION v1.17.0) # プロジェクトポリシーに合わせて調整します。\nFetchContent_Declare(\n  googletest\n  URL Google Test framework (official repository) 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## テストの実行\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## 失敗のデバッグ\n\n1. gtest フィルタで単一の失敗したテストを再実行します。\n2. 失敗したアサーションの周りにスコープ付きログを追加します。\n3. サニタイザーを有効にして再実行します。\n4. 根本原因が修正されたら、フルスイートに拡張します。\n\n## カバレッジ\n\nグローバルフラグではなく、ターゲットレベルの設定を優先します。\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## サニタイザー\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## フレーキーテストのガードレール\n\n- 同期に `sleep` を使用しないでください。条件変数またはラッチを使用してください。\n- 一時ディレクトリをテストごとに一意にし、常にクリーンアップしてください。\n- ユニットテストで実際の時間、ネットワーク、ファイルシステムの依存関係を避けてください。\n- ランダム化された入力には決定論的シードを使用してください。\n\n## ベストプラクティス\n\n### すべきこと\n\n- テストを決定論的かつ分離されたものに保つ\n- グローバル変数よりも依存性注入を優先する\n- 前提条件には `ASSERT_*` を使用し、複数のチェックには `EXPECT_*` を使用する\n- CTest ラベルまたはディレクトリでユニットテストと統合テストを分離する\n- メモリとレース検出のために CI でサニタイザーを実行する\n\n### すべきでないこと\n\n- ユニットテストで実際の時間やネットワークに依存しない\n- 条件変数を使用できる場合、同期としてスリープを使用しない\n- 単純な値オブジェクトをオーバーモックしない\n- 重要でないログに脆弱な文字列マッチングを使用しない\n\n### よくある落とし穴\n\n- **固定一時パスの使用** → テストごとに一意の一時ディレクトリを生成し、クリーンアップします。\n- **ウォールクロック時間への依存** → クロックを注入するか、偽の時間ソースを使用します。\n- **フレーキーな並行性テスト** → 条件変数\u002Fラッチと境界付き待機を使用します。\n- **隠れたグローバル状態** → フィクスチャでグローバル状態をリセットするか、グローバル変数を削除します。\n- **オーバーモック** → ステートフルな動作にはフェイクを優先し、相互作用のみをモックします。\n- **サニタイザー実行の欠落** → CI に ASan\u002FUBSan\u002FTSan ビルドを追加します。\n- **デバッグのみのビルドでのカバレッジ** → カバレッジターゲットが一貫したフラグを使用することを確認します。\n\n## オプションの付録: ファジングとプロパティテスト\n\nプロジェクトがすでに LLVM\u002FlibFuzzer またはプロパティテストライブラリをサポートしている場合にのみ使用してください。\n\n- **libFuzzer**: 最小限の I\u002FO で純粋関数に最適です。\n- **RapidCheck**: 不変条件を検証するプロパティベースのテストです。\n\n最小限の libFuzzer ハーネス（擬似コード: 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 プロジェクト関数\n    return 0;\n}\n```\n\n## GoogleTest の代替\n\n- **Catch2**: ヘッダーオンリー、表現力豊かなマッチャー\n- **doctest**: 軽量、最小限のコンパイルオーバーヘッド\n",{"name":5,"description":7},"main","7b610356e36623652299fa2acb477ff821b1d920","upstream-sync\u002Fwork\u002Fecc\u002Fdocs\u002Fja-JP\u002Fskills\u002Fcpp-testing",0,"https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fo-abdelmaksoud\u002F","Full-Stack Engineer | AI Systems Architect | Building autonomous multi-agent systems","2026-03-08 21:12:53",{"source":8,"skillName":5,"commands":44,"prompt":54,"zipAvailable":55},[45,48,51],{"tool":46,"command":47},"npx","npx skills add oabdelmaksoud\u002FSuperClaw --skill cpp-testing",{"tool":49,"command":50},"bunx","bunx skills add oabdelmaksoud\u002FSuperClaw --skill cpp-testing",{"tool":52,"command":53},"pnpm","pnpm dlx skills add oabdelmaksoud\u002FSuperClaw --skill cpp-testing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fdocs\u002Fja-JP\u002Fskills\u002Fcpp-testing\u002FSKILL.md",true,[],[58,77,91,120,146,164],{"skillNo":59,"name":60,"nameZh":6,"description":61,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":62,"categories":63,"keywords":67,"publishedAt":29},"01M6D88QCPTBZVCRED0NZ1Y8K8","visa-doc-translate","Translate visa application documents (images) to English and create a bilingual PDF with original and translation","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fvisa-doc-translate\u002FSKILL.md",[64],{"categoryNo":65,"categoryName":66,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理",[68,69,70,71,72,73,74,75,76],"translate","doc","visa doc translate","translation","application","create","images","PDF","documents",{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":29},"01M6D88NBM95T3TFM50CYYAP65","verification-loop","A comprehensive verification system for Claude Code sessions.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fverification-loop\u002FSKILL.md",[],[84,85,86,87,88,89,90],"verification","loop","verification loop","sessions","code","claude code sessions","system",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":106,"publishedAt":29},"01M6D88JFZ2P996GVRHJNSZSTM","tdd-workflow","Use this skill when writing new features, fixing bugs, or refactoring code. Enforces test-driven development with 80%+ coverage including unit, integration, and E2E tests.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Ftdd-workflow\u002FSKILL.md",[97,98,101],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":99,"categoryName":100,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":102,"categoryName":103,"taxonomyType":104,"taxonomyTypeDesc":105},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[107,108,109,110,111,112,88,113,114,115,116,117,118,119],"tdd","workflow","tdd workflow","e2e tests","e2e","integration","development","use","test","refactoring","coverage","tests","writing",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":126,"publishedAt":29},"01M6D88FTHRRSVJMXF2G7MQAK3","swiftui-patterns","SwiftUI architecture patterns, state management with @Observable, view composition, navigation, performance optimization, and modern iOS\u002FmacOS UI best practices.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fswiftui-patterns\u002FSKILL.md",[],[127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145],"patterns","swiftui","swiftui patterns","architecture","macos","performance","state management","best practices","state","ui","Optimization","ios","architecture patterns","Composition","performance optimization","view","management","swiftui architecture","navigation",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":153,"publishedAt":29},"01M6D88D527QTQT9DKHTRFN6EA","swift-protocol-di-testing","Protocol-based dependency injection for testable Swift code — mock file system, network, and external APIs using focused protocols and Swift Testing.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fswift-protocol-di-testing\u002FSKILL.md",[152],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[154,155,156,24,88,157,158,159,160,90,161,162,163],"swift protocol di testing","protocol","swift","protocols","file","network","injection","dependency","swift testing","dependency injection",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":170,"publishedAt":29},"01M6D88AJW8H2QNWSW5ZY82R43","swift-concurrency-6-2","Swift 6.2 Approachable Concurrency — single-threaded by default, @concurrent for explicit background offloading, isolated conformances for main actor types.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FSuperClaw\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fswift-concurrency-6-2\u002FSKILL.md",[],[171,172,156,173,174,34],"concurrency","swift concurrency","swift concurrency 6 2","default"]