このページでは、MagicPodでモバイルのFlutterアプリをテストする際に必要となるテストケース作成での工夫や制限事項を紹介します。
1. 前提条件
- Flutter 3.3以上
- Xcode 14.1以上
また、こちらのガイドラインに沿って、FlutterアプリがE2Eテスト可能になっていることを確認してください。
2. テストステップの動作確認状況
クラウド端末、BrowserstackおよびSauceLabsでFlutterアプリのテストに関わる主要なテストステップの動作確認を実施しています。以下のアイコンを使用しています。
✅ | 動作確認済み |
⚠️ | 一部問題あり |
❓ | 動作未確認 |
なお、動作確認には以下のコマンドでビルドされたFlutterアプリを使用しています。
- .apkファイル: flutter build apk --debug
- .aabファイル: flutter build appbundle --debug
- .appファイル: flutter build ios --simulator
- .ipaファイル: flutter build ipa --export-method development
クラウド端末
種類 | コマンド | Android | iOS |
画面操作 | タップ | ✅ | ✅ |
画面操作 | ダブルタップ | ✅ | ⚠️ |
画面操作 |
フリック |
✅ | ✅ |
画面操作 | ドラッグ & ドロップ | ✅ | ⚠️ |
画面操作 | 長押し & 移動 | ✅ | ✅ |
画面操作 | ピンチアウト | ✅ | ✅ |
画面操作 | ピンチイン | ✅ | ✅ |
画面操作 | スワイプ | ✅ | ✅ |
画面操作 | フリーハンドで図形を描画 | ✅ | ✅ |
画面操作 | 表示されるまでスワイプ | ✅ | ✅ |
画面操作 | 長押し | ✅ | ⚠️ |
画面操作 | 位置指定タップ | ✅ | ✅ |
画面操作 | 画面中央をマルチタッチ操作 | ❓ | ✅ |
画面入力 | テキスト入力 | ✅ | ✅ |
画面入力 | ピッカー値入力 | ❓ | ❓ |
画面入力 | キーボードキー入力 | ✅ | ✅ |
画面入力 | スイッチ操作 | ✅ | ✅ |
その他 | UI要素の値を取得 | ⚠️ | ✅ |
その他 | WebViewテスト | ✅ | ✅ |
Browserstack
種類 | コマンド | Android | iOS |
画面操作 | タップ | ✅ | ✅ |
画面操作 | ダブルタップ | ✅ | ⚠️ |
画面操作 |
フリック |
✅ | ✅ |
画面操作 | ドラッグ & ドロップ | ✅ | ⚠️ |
画面操作 | 長押し & 移動 | ✅ | ✅ |
画面操作 | ピンチアウト | ✅ | ✅ |
画面操作 | ピンチイン | ✅ | ✅ |
画面操作 | スワイプ | ✅ | ✅ |
画面操作 | フリーハンドで図形を描画 | ✅ | ✅ |
画面操作 | 表示されるまでスワイプ | ✅ | ✅ |
画面操作 | 長押し | ✅ | ⚠️ |
画面操作 | 位置指定タップ | ✅ | ✅ |
画面操作 | 画面中央をマルチタッチ操作 | ❓ | ✅ |
画面入力 | テキスト入力 | ✅ | ✅ |
画面入力 | ピッカー値入力 | ❓ | ❓ |
画面入力 | キーボードキー入力 | ✅ | ✅ |
画面入力 | スイッチ操作 | ✅ | ✅ |
その他 | UI要素の値を取得 | ⚠️ | ✅ |
その他 | WebViewテスト | ⚠️ | ⚠️ |
SauceLabs
種類 | コマンド | Android | iOS |
画面操作 | タップ | ✅ | ✅ |
画面操作 | ダブルタップ | ✅ | ✅ |
画面操作 |
フリック |
✅ | ✅ |
画面操作 | ドラッグ & ドロップ | ✅ | ⚠️ |
画面操作 | 長押し & 移動 | ✅ | ⚠️ |
画面操作 | ピンチアウト | ✅ | ⚠️ |
画面操作 | ピンチイン | ✅ | ⚠️ |
画面操作 | スワイプ | ✅ | ✅ |
画面操作 | フリーハンドで図形を描画 | ✅ | ✅ |
画面操作 | 表示されるまでスワイプ | ✅ | ✅ |
画面操作 | 長押し | ✅ | ⚠️ |
画面操作 | 位置指定タップ | ✅ | ✅ |
画面操作 | 画面中央をマルチタッチ操作 | ❓ | ✅ |
画面入力 | テキスト入力 | ✅ | ✅ |
画面入力 | ピッカー値入力 | ❓ | ❓ |
画面入力 | キーボードキー入力 | ✅ | ✅ |
画面入力 | スイッチ操作 | ✅ | ✅ |
その他 | UI要素の値を取得 | ⚠️ | ✅ |
その他 | WebViewテスト | ⚠️ | ⚠️ |
3. テストケース作成の工夫
3.1. iOS/Android共通
3.1.1. 1つのテストケースでiOSとAndroidアプリ両方のテストを行いたい
マルチプラットフォームなFlutterアプリの開発の場合と同様に、1つのテストケースを両プラットフォームで実行したいケースがあります。その場合は、https://support.magic-pod.com/hc/ja/articles/16904866116249#native_apps を参考にしてください。
3.1.2. テキスト入力に失敗する場合がある
テキスト入力対象のテキストフィールドにフォーカスできていない時、テキスト入力に失敗することがあります。その場合は、テキスト入力コマンドの前にタップコマンドを追加するようにします。
- アプリの実装によりタップ前後で必要となるロケータが変わることがあります。その場合は、共通のaccessibility idを付与 (https://support.magic-pod.com/hc/ja/articles/16904866116249#assign_common_accessibility_id) したり、XPathで改善 (https://support.magic-pod.com/hc/ja/articles/16904866116249#improve_xpath) することで、タップ前後のロケータを使いまわすことができます
- iOSの場合、タップコマンドでテキストフィールドにフォーカスできないことがあります。その場合、タップコマンドを指定位置タップに変更してください。
- テキストフィールドにフォーカスした後も、テキスト入力に失敗することがあります (特にiOS)。その場合は、待機ポリシーを「安定性を重視」に変更することを検討してください。
3.2. iOS
3.2.1. タップ操作に失敗する
- Xcode側の問題 (https://github.com/appium/appium/issues/16913) により、タップ操作が失敗することがあります。その場合、タップコマンドを指定位置タップに変更してください。
- 指定位置タップも失敗する場合は、待機ポリシーを「安定性を重視」に変更することを検討してください。
3.3. Android
3.3.1. UI要素の値が取れない、空文字がとれてしまう
Flutter側の変更 (https://github.com/flutter/flutter/issues/124493)により、Flutter 3.3.10以降でUI要素の値が取得できないことがあります。この場合は、content-desc属性あるいはhint属性を使うことでUI要素の値と同等の結果を得られる場合があります。
ただし、content-desc属性は本来視力が不自由な人のための音声読み上げ機能などに使用する情報なので、画面に表示されたUI要素の値と異なる場合があります。
4. 制限事項
- 2023年05月の時点でMagicPodは異なるプラットフォームでキャプチャされたUIに対するセルフヒーリングをサポートしていません。そのため、例えば、iOSで取得したロケータをAndroidで使用してそのロケータで対象要素が見つからない場合、セルフヒーリングは発動しません。
- 2023年05月の時点で、Keyクラスを使用するUI要素の操作には対応していません。
- iOSにおいて、同一画面で2度以上 長押し & 移動 コマンドを実行した場合、2度目以降の 長押し & 移動 コマンドが失敗することがあります。