Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Maestro MCPとClaude Code Skillsによる自律的なE2Eテスト支援

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for asmz asmz
October 29, 2026

Maestro MCPとClaude Code Skillsによる自律的なE2Eテスト支援

Talked at FlutterKaigi 2026

Avatar for asmz

asmz

October 29, 2026

More Decks by asmz

Other Decks in Technology

Transcript

  1. 誰なのか? • • • • Akira Shimizu / asmz (@_asmz)

    https://asmz.beer/ 仙台在住 モバイルアプリエンジニア ◦ Flutter / React Native / ネイティブ(iOS / Android ) • 株式会社フライヤー所属 ◦ ◦ https://www.flierinc.com/ モバイルアプリケーショングループ テックリード asmz.beer 2
  2. 目次 • • • • • • • モバイルE2Eテストの課題感 Maestro

    MCPとClaude Code Skills SkillへのE2Eテストノウハウの実装 AIエージェントによるE2Eテストの作成 AIエージェントによるE2Eテストの修復 Skillの実装を通して得られた学び まとめ asmz.beer 3
  3. モバイルE2Eテストの課題感 Maestroとは • E2Eテストフレームワーク • YAMLで宣言的にテストシナリオ (フロー)を書ける • iOS・Androidの両方に対応 appId:

    com.example.app --- launchApp - tapOn: "メールアドレス " - inputText: "[email protected]" - tapOn: "パスワード" - inputText: "password" - tapOn: "ログイン" maestro.dev asmz.beer 8
  4. モバイルE2Eテストの課題感 E2E整備の手間を AIに肩代わりさせたい 1. テストシナリオを考える 2. アプリを操作してテストを作る 3. 実行結果を確認する 4.

    アプリの変更に合わせて修正する 主要シナリオから先に進めない AIエージェントと Maestro MCPで、この整備を肩代わりできないか asmz.beer 9
  5. Maestro MCPとClaude Code Skills Maestro MCPとは MCP対応のAIエージェントから、Maestroを操作するためのMCPサーバ AIエージェント (Claude Code)

    デバイス確認 list_devices Maestro MCP スクリーンショット take_screenshot シミュレータ / 実機 画面要素の取得 Flowの実行 inspect_screen run asmz.beer 11
  6. Maestro MCPとClaude Code Skills Maestro MCPだけでもある程度は動く できるようになったこと 残る課題 AIがアプリを操作し、 画面を見ながら動作確認まで

    進めてくれる シナリオの品質や進め方は、指示 の内容に大きく左右される 同じ判断基準を、毎回の指示で伝 え直すことになる asmz.beer 12
  7. Maestro MCPとClaude Code Skills Claude Code Skillsとは • エージェントに開発ノウハウや ワークフローを持たせる仕組み

    • 依頼の内容に応じて、Claudeが 自動で読み込む • 今回は公式のskill-creatorで 作成 maestro-flutter-agent/ .claude-plugin/plugin.json .mcp.json Maestro MCPを同梱 skills/maestro-flutter-agent/ SKILL.md 手順と判断基準 references/ YAMLリファレンス evals.json 評価ケース asmz.beer 13
  8. Maestro MCPとClaude Code Skills MCPとSkillを組み合わせる Maestro MCPで「できること」 を増やし、 Claude Code

    Skillsで「どう使うか」 を与える Maestro MCP:できること 画面の観察、アプリの操作、Flowの実行 Skill:どう使うか ワークフロー、判断基準、失敗したときの進め方 asmz.beer 14
  9. Maestro MCPとClaude Code Skills 今回作ったもの:業務版と汎用版 業務版Skill 汎用版Skill maestro-flow-generator maestro-flutter-agent 切り出し

    flierのFlutterアプリ向けに作成し、 社内で運用 プロジェクト固有のルールや既存 identifierを持つ 他のFlutterアプリでも使えるように切り 出し、OSSで公開 今日のデモはこちらを使用 https://github.com/asmz/asmz-agent-plugins asmz.beer 15
  10. SkillへのE2Eテストノウハウの実装 ワークフローの全体像 0 1 2 3 MCP接続チェック シナリオ理解 UIコード調査 セレクタ決定

    4 5 6 7 フロー生成 identifier追加 再ビルド MCPで実行確認 Step 7で失敗したら、フィードバックループで調査と修正を繰り返す asmz.beer 19
  11. SkillへのE2Eテストノウハウの実装 最初にMaestro MCPの接続を確認させる • 最初のツール呼び出しで list_devices を実行する • Maestro MCPが使えなければ、再接続を待つ

    • CLIでの代替実行は案内しない 理由: - 同じようなテストを繰り返すため、実行結果を安定させたい - Maestro MCPのツール内でクイックにフィードバックループさせたい asmz.beer 0 接続 1 理解 2 調査 3 選定 4 生成 5 ID追加 6 ビルド 7 実行 20
  12. SkillへのE2Eテストノウハウの実装 セレクタの優先順位 1. Semantics identifier id: ◦ テスト用の識別子。言語やテキストの変更に影響されない 2. 表示テキスト

    text: ◦ identifierがない場合のフォールバック 3. 正規表現テキスト ◦ text: "Profile.*" 改行を含むa11yテキストなど(次で説明) 4. 座標 point: ◦ 最終手段 asmz.beer 0 接続 1 理解 2 調査 3 選定 4 生成 5 ID追加 6 ビルド 7 実行 21
  13. SkillへのE2Eテストノウハウの実装 Flutterの落とし穴:タブの a11yテキスト • • TabBarやBottomNavigationBarのa11yテキストには、Flutterが「Tab 1 of 3」などの補足を 付け足す

    言語設定やタブの数・順番で変わるため、セレクタとしては不安定 悪い例 良い例 - tapOn: text: "Profile\nTab 1 of 3" - tapOn: id: "nav_profile_tab" # identifierがなければ - tapOn: text: "Profile.*" asmz.beer 0 接続 1 理解 2 調査 3 選定 4 生成 5 ID追加 6 ビルド 7 実行 22
  14. SkillへのE2Eテストノウハウの実装 フロー生成のルール appId: ${APP_ID} --- startRecording: path: e2e/screenshots/... - launchApp

    - tapOn: id: "nav_blog_tab" - assertVisible: text: "Blog.*" # ... 開始時の画面に戻る - stopRecording asmz.beer 0 接続 • appIdは環境変数で渡す • 録画で前後を囲む • 画面遷移のたびにassertVisible で検証する 終了時は開始時と同じ画面に戻す 画面状態を揃えておくと、 複数のフローを連続実行できる 1 理解 2 調査 3 選定 4 生成 5 ID追加 6 ビルド 7 実行 23
  15. SkillへのE2Eテストノウハウの実装 Semantics(identifier)の追加を提案する // 追加前 InkWell( onTap: () => ..., child:

    Text('送信'), ) 命名は [feature]_[element_type] • テストで操作する要素だけに、 最小限で追加 • 0 接続 1 理解 コードの変更はユーザーの確認を 得てから // 追加後 Semantics( identifier: 'form_submit_button', child: InkWell(...), ) asmz.beer • • 2 調査 追加後は再ビルド・インストール 3 選定 4 生成 5 ID追加 6 ビルド 7 実行 24
  16. SkillへのE2Eテストノウハウの実装 フィードバックループ:失敗時の調査と修正 take_screenshot inspect_screen run(yaml) cheat_sheet run 画面を見る 要素を調べる 小さく再現

    構文を確認 直して再実行 通るまで繰り返す 3回で止める 直らなければ、試した内容を添えて人に報告 asmz.beer 0 接続 1 理解 2 調査 3 選定 4 生成 5 ID追加 6 ビルド 7 実行 25
  17. AIエージェントによるE2Eテストの作成 エージェントがやったこと 1. Maestro MCPの接続を確認 2. Flutterコードと既存フローを調査 3. 画面要素を取得 4.

    identifierの追加を選択肢つきで確認 5. 追加して再ビルド 6. 遷移先を小さなYAMLで確認 7. フローを作成し、1回目で成功 asmz.beer 29
  18. AIエージェントによるE2Eテストの修復 エージェントがやったこと 1. 既存のフローを実行し、失敗を再現 2. 全画面モーダルが原因と特定 3. UIコードから残り 2つも発見 4.

    閉じるボタンへの identifier追加を確認 5. 3か所に閉じるステップを追加 6. 2回目の失敗:閉じるタップが空振り 7. アニメーション待ちを追加 8. フロー再実行で成功 + # 起動時:アップデートのお知らせ + - extendedWaitUntil: ... + - waitForAnimationToEnd # 追加 + # 追加したidentifierで閉じる操作 + - tapOn: + id: "update_notice_later_button" + # OSネイティブアラートは identifier追加 できないため textセレクタで対応 + - tapOn: + text: "今はしない " + : 空振りの原因を切り分け、 同じくせり上がるボトムシートにもアニメーション待ちを先回りで追加 asmz.beer 34
  19. Skillの実装を通して得られた学び 学び④ Skillは育てるもの 踏んだ問題をルールにする iOSでback_buttonのタップが空振りする 場合がある → スワイプで戻るサブフローを用意 存在しないMaestro MCPのツールを呼ぼ

    うとする → 実在する9種類を明記 asmz.beer チームのルールや前提を教える E2Eで見る範囲をAIに任せない → チームで決めたテスト対象範囲を明記 既存のidentifierを毎回探させない → 命名済みのidentifierの一覧を持たせ る 運用で踏んだ問題とチームの開発ルール 両方を取り込みながら育てていく 40
  20. まとめ まとめ 考え方 Maestro MCPで「できること」 を増やし、 Claude Code Skillsで「どう使うか」 を与える

    実践 Semantics identifierの優先、全文一致の回避、失敗時の調 査手順など、人の判断をそのまま Skillに書き起こす 始め方 汎用版を土台に、チームの前提と運用で踏んだ問題を少しず つ足していくことで自分たち専用の Skillに育てる asmz.beer 42