mcpField
T
testing-mobile-apps

testing-mobile-apps

github.com/jeremylongshoreテスト・品質2.9k54 回インストール2 日前に更新
リポジトリ

testing-mobile-apps について

iOS シミュレーターと Android エミュレーターでモバイルアプリの自動テストを計画・実行するスキルです。一般的な UI フロー、ジェスチャー、プラットフォーム固有の動作を複数のテストフレームワークで扱います。

主な機能

  1. 01iOS・Android エミュレーターでのテスト
  2. 02UI フロー、ジェスチャー、画面遷移の確認
  3. 03プラットフォーム固有の動作を検証
  4. 04複数のモバイルテストフレームワークに対応
  5. 05失敗時のスクリーンショットとレポート

活用シーン

  1. 01端末でのログインと画面遷移の検証
  2. 02権限、ディープリンク、通知のテスト
  3. 03アクセシビリティと画面回転の確認
  4. 04CI 向けのスクリーンショットとレポート収集

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jeremylongshore/tons-of-skills-marketplace --skill testing-mobile-apps

インストール後、Claude Code で/testing-mobile-appsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
README.md
references/
README.md
scripts/
README.md

詳細

モバイルアプリテスター

概要

iOS シミュレーターと Android エミュレーターで、UI 操作、ナビゲーションフロー、ジェスチャー処理、プラットフォーム固有の動作を対象に、モバイルアプリケーションの自動テストを実行します。Appium、Detox(React Native)、XCUITest(iOS ネイティブ)、Espresso(Android ネイティブ)、Maestro に対応し、クロスプラットフォームのモバイルテストを実行できます。

前提条件

  • モバイルテストフレームワークがインストールされていること(Appium、Detox、Maestro、またはネイティブの XCUITest/Espresso)
  • Xcode 経由の iOS シミュレーター(macOS のみ)、または Android SDK 経由の Android エミュレーター
  • アプリケーションのビルド成果物(.app、.apk、または .ipa)、またはバンドルされた開発サーバー(React Native)
  • Appium を使用する場合、Appium ドライバー(Android 用の uiautomator2、iOS 用の xcuitest)がインストールされていること
  • JavaScript ベースのテストランナー用の Node.js

手順

  1. テスト環境を設定します。
    • 対象デバイス/シミュレーターを一覧表示します。OS バージョン、画面サイズ、向きを指定します。
    • テスト用にアプリケーションをビルドします(xcodebuild、./gradlew assembleDebug、または npx react-native build)。
    • エミュレーター/シミュレーターを起動するか、実機を接続します。
    • 対象デバイスにアプリをインストールします。
  2. モバイルの基本操作を対象とするテストケースを作成します。
    • タップとナビゲーション:ボタンをタップし、画面間を移動し、戻る操作を検証します。
    • テキスト入力:フォームに入力し、キーボードの動作を検証し、自動補完と貼り付けをテストします。
    • スクロール:リストをスクロールし、遅延読み込みを検証し、プル・トゥ・リフレッシュをテストします。
    • ジェスチャー:スワイプ(カルーセル)、ピンチによるズーム、長押し、ドラッグ&ドロップをテストします。
    • システム操作:権限ダイアログ、プッシュ通知、ディープリンクを処理します。
  3. プラットフォーム固有の動作をテストします。
    • iOS:セーフエリアのインセット、ノッチへの対応、Dynamic Type、VoiceOver のアクセシビリティ。
    • Android:戻るボタンの動作、マルチウィンドウ、さまざまなナビゲーションパターン、TalkBack。
    • 両方:画面の回転(縦向き/横向き)、ダークモード、低バッテリーモード。
  4. デバイス固有のテスト設定を実装します。
    • デバイス/OS の組み合わせごとにケイパビリティセットを定義します。
    • テストタグを使用して、特定のプラットフォームでテストの一部を実行します(@ios、@android)。
    • ビジュアルデバッグ用に、失敗時のスクリーンショット取得を設定します。
  5. 非同期のモバイル動作を処理します。
    • アサーションの前にアニメーションが完了するまで待機します。
    • 明示的な待機を使用して、ネットワーク読み込み中のスピナーを処理します。
    • テストフローを中断するシステムダイアログ(権限、更新)を考慮します。
  6. テストスイートを実行し、結果を取得します。
    • プラットフォームごとにテストを実行します:npx detox test --configuration ios.sim.debug。
    • デバイスログ、スクリーンショット、クラッシュレポートを収集します。
    • CI 連携用に JUnit XML または Allure レポートを生成します。
  7. モバイルテスト用の CI パイプラインを設定します(iOS には GitHub Actions の macOS ランナー、Android には Linux を使用)。

出力

  • 機能/フローごとに整理されたモバイルテストファイル(tests/mobile/ または e2e/)
  • 対象デバイス/OS の組み合わせごとのデバイス設定プロファイル
  • ビジュアル検証と失敗のデバッグ用スクリーンショット
  • デバイス固有のメタデータを含む JUnit XML 形式のテスト結果
  • モバイルテストを自動実行するための CI パイプライン設定

エラー処理

エラー原因解決策
シミュレーター/エミュレーターが起動しないディスク容量不足、またはシミュレーターイメージの破損派生データを削除してシミュレーターをリセットします。ディスク割り当てを増やすか、エミュレーターの AVD を再作成します
テスト中にアプリが起動時にクラッシュする権限が不足している、または OS バージョンに互換性がない最小デプロイメントターゲットを確認します。テストのセットアップで必要な権限を付与し、アプリの署名を確認します
要素が見つからない要素 ID が変更された、または画面の読み込みが完了していないXPath ではなくアクセシビリティ ID を使用します。明示的な待機を追加し、操作前に要素が表示されていることを確認します
CI ではテストが不安定だが、ローカルでは成功するCI ランナーの CPU/GPU が低速で、アニメーションやタイミングに影響しているCI の待機タイムアウトを延長します。開発者設定でアニメーションを無効にし、専用の CI ハードウェアを使用します
権限ダイアログがテストを妨げるアプリの UI の上にシステムアラートが表示されたテストのセットアップでアラートを自動的に閉じます。xcrun simctl または ADB コマンドで事前に権限を付与します

例

React Native のログインフローをテストする Detox の例:

describe('Login Flow', () => {
  beforeAll(async () => { await device.launchApp(); });
  beforeEach(async () => { await device.reloadReactNative(); });

  it('logs in with valid credentials', async () => {
    await element(by.id('email-input')).typeText('[email protected]');
    await element(by.id('password-input')).typeText('password123');
    await element(by.id('login-button')).tap();
    await expect(element(by.id('home-screen'))).toBeVisible();
  });
});

Maestro フローファイル:

appId: com.example.myapp
---
- launchApp
- tapOn: "Sign In"
- inputText:
    id: "email-input"
    text: "[email protected]"
- inputText:
    id: "password-input"
    text: "password123"
- tapOn: "Submit"
- assertVisible: "Welcome"

リソース

コメント