ひとり開発者が直面した「テストの無人地帯」

Christopher Meiklejohnは、コミュニティ向けアプリ「Zabriskie」をひとりで開発している。チームも投資家もなく、ベッドルームで黙々とシップし続けるスタイルだ。Webアプリとして好評だったものの、「App Storeにないアプリは存在しないも同然」という現実に直面し、iOS・Android・Webの3プラットフォーム同時対応を余儀なくされた。

1人で3つのコードベースを維持するのは現実的でない。そこで採用したのが Capacitor だ。既存のReact Webアプリをネイティブシェルで包み込み、AndroidではWebView、iOSではWKWebViewとして動作させることで、単一コードベースから3プラットフォームに展開できる。さらにサーバー側からJSON形式で画面レイアウトを送る「サーバードリブンUI」アーキテクチャを組み合わせることで、App Storeのレビュー待ちなしに変更を全プラットフォームへ即反映できる。

しかしここに落とし穴がある。Capacitorアプリはテストツールの「無人地帯」に落ちるのだ。PlaywrightはネイティブシェルのWebViewにアクセスできず、XCTestやEspressoといったネイティブテストフレームワークはWebViewの中のHTML要素を操作できない。Webツールには「ネイティブすぎ」、ネイティブツールには「Web的すぎ」という宙ぶらりんな状態になる。

ClaudeをQAエージェントとして訓練する

WebアプリにはPlaywrightで150本以上のE2Eテストが走っているが、モバイルアプリ側には何もなかった。そこでMeiklejohnは、ClaudeにAndroid・iOSの両プラットフォームを操作させ、スクリーンショットを撮って問題を検出し、バグレポートまで自動で起票させる仕組みを構築することにした。

Androidは90分で解決

Androidエミュレーター内ではlocalhostがホストMacではなくエミュレーター自身を指すため、まずadb reverseでポートフォワーディングが必要だ。これは再起動のたびに再実行が必要なものの、ワンライナーで済む。

本命の突破口は、CapacitorアプリがChrome DevTools Protocol(CDP)ソケットを公開しているという事実だ。adb shellでWebViewのDevToolsソケットを特定してローカルポートに転送すれば、PlaywrightやPuppeteerと同じプロトコルでAndroid WebViewを完全制御できる。JWTをlocalStorageに注入して認証、window.location.hrefでナビゲーション——座標指定やUI操作は一切不要。adb shell screencapでスクリーンショットを取得するPythonスクリプトと合わせて、Android環境はわずか90分で完成した。

iOSは6時間以上の格闘

対照的に、iOSは6時間以上を要した。この差は2026年時点のモバイル自動化ツールの成熟度を如実に物語っている。iOSのWebViewはAndroidほどオープンなデバッグインターフェースを持たず、Apple独自のセキュリティモデルがあらゆる迂回路を塞ぐ。

AI活用QAの可能性と現実

この事例は、ClaudeをはじめとするLLMをQAエンジニア的に活用する流れを示している。単にコードを書かせるだけでなく、スクリーンショットを見て視覚的なバグを検出させたり、バグレポートを自動作成させたりといった使い方だ。1人開発者がリソース制約の中でQA品質を維持するための現実的な戦略として注目される。

AndroidとiOSの難易度差は、モバイル自動化エコシステムの分断を象徴している。Capacitorのような「Write Once, Run Anywhere」アプローチはコード共有を実現する一方、テスト環境の整備は依然として各プラットフォーム固有の課題が残ることを、この実践レポートは教えてくれる。


元記事: Teaching Claude to QA a mobile app