BLOG
Maestroとintegration_testの比較
はじめに
最近取り組んだプロジェクトでは、これまで手動で行っていたテストを自動テストツールで置き換えるという作業を行いました。
その中で、Maestroとintegration_testのツールを実際に導入し、詳細な調査と比較を行いました。
本記事では、これらの調査結果を詳細に紹介していきます。
下記が目次となりますので、結論から知りたい方は、まとめからご覧ください。
概要
Maestroとは
Maestroは、iOSとAndroid向けのネイティブアプリだけでなく、FlutterやReact NativeアプリのUIテストを素早くかつ効率的に作成できます。画面上の情報のみを使用してテストを行うため、一貫したテスト結果が得られます。Maestroは、開発者が迅速にバグを発見し、アプリの品質を向上させるのに役立ちます。
integration_testとは
Flutterのintegration_testは、Flutterアプリケーションの統合テストを行うためのテストフレームワークです。これは、Flutterプロジェクトの一部として提供されており、flutter_testパッケージに含まれています。integration_testを使用することで、アプリケーションのUIを操作し、ユーザーの操作やアプリケーションの反応をシミュレートしてテストすることが可能です。
比較表
Maestro | integration_test | |
---|---|---|
学習コスト | ◯ ・テストコードがYAML形式で作成 ・MaestroスタジオでGUI形式でテスト作成可能 | △ ・テストコードがDartで作成可能 ・テスト用のメソッドが多いため、把握に時間がかかる ・ソースコードに対しての修正も一部必要 |
保守性 (機能の修正や不具合修正がある場合の影響範囲) | △ ・テストデータが散乱していると、テストケースの修正や追加が困難になり、保守性が低下する | △ ・モックを多用していると、修正の影響範囲を特定するのが難しくなり、保守性が低下する |
有償サポートの有無 | ◯(クラウドでのテスト実行などが可能) ・15円 / Flow Run(テスト確認) https://www.mobile.dev/ | ◯(クラウドでのテスト実行などが可能) ・Spark プラン(無料): リソース上限は、合計で 1 日あたり最大 15 件のテスト実行 ・仮想デバイスでは 1 日あたり 10 件のテスト実行 ・実機では 1 日あたり 5 件のテスト実行 ・Blaze プラン: 料金は、テストの実行にかかった時間(分)で計算される ・実機では 1 日あたり 30 分のテスト時間 ・仮想デバイスでは 1 日あたり 60 分のテスト時間 ・これらの上限を超えると、次の時間単位で課金される ・各実機につき 1 時間あたり 750円 ・各仮想デバイスにつき 1 時間あたり 150円 https://firebase.google.com/docs/test-lab |
提供元 | ・mobile.dev inc | ・Flutter公式 |
安定性・信頼性 | ◯ ・バージョンが定期的に更新されている(2週間〜1ヶ月半) | ◯ ・バージョンが定期的に更新されている ・Flutterバージョンに準拠 |
ネット情報の多さ | ◯ ・公式サイトとブログしか情報が掲載されてない | ◯ ・公式サイトやブログ、フォーラムなど、さまざまな場所に情報が掲載されている |
Flutterへの適用性 | △ ・Unicode非対応(issueはあり) | ◯ ・Flutterのウィジェットツリーを直接テストでき、UIの正確性やアプリケーション全体の振る舞いをテストできる |
他アプリ言語への適用性 (SwiftやKotlin等) | ◯ ・他のプログラミング言語は利用可 https://maestro.mobile.dev/platform-support/supported-platfor | × ・他のプログラミング言語は利用不可 |
実機での使用性 (最新OSでも問題無く利用できるか) | △ ・Android:可(動作確認済み) ・iOS:不可 現在、サポート対象外(issueはあり) https://maestro.mobile.dev/getting-started/installing-maestro#connecting-to-your-device https://github.com/mobile-dev-inc/maestro/issues/686 | ◯(公式サイトに記載) ・Android:可(動作確認済み) ・iOS:可(動作確認済み) https://docs.flutter.dev/cookbook/testing/integration/introduction#5a-mobile |
歴史、最新バージョン | ・最新バージョン:1.36.0(2024年2月前半) ・初回登場:2022年7月20日(GitHubの履歴から) https://github.com/mobile-dev-inc/maestro/releases?page=9 | ・Flutterバージョンに準拠 ・初回登場:2020年11月20日(ver 1.24.0-10.2)(GitHubの履歴から) https://github.com/flutter/flutter/blob/flutter-1.24-candidate.12/packages/integration_test/lib/integration_test.dart |
Push通知テスト可否 | ◯ ・Android:可 ・iOS:可 | × ・Android:不可 ・iOS:不可 |
それぞれのメリットについて
Maestro | integration_test |
---|---|
シンプルで使いやすい | 簡単なセットアップ |
強力な機能 | Flutter公式パッケージによる安心感 |
GUIツール | 高速なテスト実行 |
ネイティブ機能とプッシュ通知の確認可能 | UIの完全なテスト |
Maestro
Maestro には以下のメリットがあります。
- シンプルで使いやすい
Maestro は、シンプルで使いやすい設計になっています。テストコードを書くための専用の DSL (Domain Specific Language) が必要なく、YAML形式で作成できます。そのため、特別な知識は必要なく、すぐに使い始めることができます。 - 強力な機能
Maestro は、強力な機能を備えています。アプリの起動、画面遷移、ボタンタップ、テキスト入力、要素の検索など、さまざまな操作を自動化できます。また、テスト結果のスクリーンショットや動画を記録することもできます。 - GUIツール
Maestroには、Maestro StudioというGUIツールが用意されています。Maestro Studioを使用すると、テストの作成、実行、管理を視覚的に行うことができます。Maestro Studioは、特にテスト初心者にとって使い勝手の良いツールです。 - ネイティブ機能とプッシュ通知の確認可能
Maestroは、カメラ、マイク、位置情報など、デバイスのネイティブ機能をシミュレートしてテストすることができます。さらに、プッシュ通知の送信と受信をシミュレートすることもできます。
integration_test
- 簡単なセットアップ
integration_testは、Flutterアプリの環境でテストを実行できるため、セットアップが非常に簡単です。既存のFlutterプロジェクトに統合しやすく、テストを追加するのに大きな手間はかかりません。 - Flutter公式パッケージによる安心感
integration_testはFlutter公式のテストパッケージで、安定性と将来性が確保されています。さらに、豊富なドキュメントとコミュニティリソースを利用できます。 - 高速なテスト実行
Maestroと比べて、テストの実行速度が約2倍のスピードであることが特徴です。アプリの規模が大きくなるほど、この差はより顕著に現れます。 - UIの完全なテスト
FlutterアプリのUIを完全にテストできます。ウィジェットのプロパティだけでなく、ウィジェットツリー全体の動作や相互作用をテストできます。これにより、アプリのUIの正確性を保証することができます。
それぞれのデメリットについて
Maestro | integration_test |
---|---|
テストの実行速度が遅い | スクリーンショットを撮ることが難しい |
テストの信頼性が低い | APIのレスポンスを待つための工夫が必要 |
iOS実機での動作がサポート対象外 | ネイティブ機能へのアクセス制限 |
テキストフィールドでの日本語入力がサポート対象外 | 接続の切り替えができない |
Maestro
- テストの実行速度が遅い
Maestroは、すべてのUI操作をシミュレートするため、テストの実行速度が遅くなります。特に、複雑なUIを持つアプリの場合は、テストの実行に時間がかかる場合があります。 - テストの信頼性が低い
Maestroは、UI操作をベースとしたテストを行うため、UIの変化によってテストが失敗してしまうことがあります。また、ランダムな要素を含むテストは、Maestroで作成することが困難です。 - iOS実機での動作がサポート対象外
Maestro は、Android 実機とエミュレータでのテストをサポートしていますが、iOS 実機でのテストは現状サポートされていません。 - テキストフィールドでの日本語入力がサポート対象外
Maestroは、日本語を含むテキスト入力の自動テストを直接サポートしていません。しかし、キーボード操作を自動化することで、間接的に日本語入力をシミュレートすることは可能です。
integration_test
- スクリーンショットを撮ることが難しい
integration_testでテスト結果を可視化するために、スクリーンショットを撮りたい場合、flutter_driverを利用する必要があります。flutter_driverは、テスト対象となるアプリを制御するためのライブラリですが、設定や操作が複雑で、使いこなすのに時間がかかります。 - APIのレスポンスを待つための工夫が必要
APIからのレスポンスを待つには、flutter_test
パッケージのWidgetTesterExtension
を使う必要があります。この拡張機能は、テストコードを複雑にし、メンテナンス性を悪化させる可能性があります。 - ネイティブ機能へのアクセス制限
integration_testは、ネイティブ機能やプラットフォーム固有の機能をテストすることには適していません。例えば、カメラやセンサーなどのハードウェア機能をテストする場合、その機能をテストすることはできません。 - 接続の切り替えができない
異なるネットワーク条件(3G、4G、Wi-Fiなど)やデバイスの状態(オンライン、オフライン)などをシミュレートすることができないため、ネットワークに依存するアプリケーションのテストには課題が残ります。
まとめ
Maestroとintegration_testは、それぞれ異なるメリットとデメリットを持つツールです。どちらのツールが適しているかは、プロジェクトの要件によって異なります。
- シンプルなテストを素早く作成したい場合は、Maestroがおすすめです。
- 安定性と信頼性の高いテストを作成したい場合は、integration_testがおすすめです。
- ネイティブ機能やプッシュ通知のテストを行いたい場合は、Maestroがおすすめです。
- UIの完全なテストを行いたい場合は、integration_testがおすすめです。
Maestroも魅力的なツールですが、今回のプロジェクトでは、integration_testを選択しました。当該プロジェクトでは、特に実機でテストできることが求められました。Maestroはシミュレーターでのテストしか行えないため、integration_testを利用することになりました。
将来的にMaestroがiOSの実機デバイスでのテストを可能にするという可能性があれば、ぜひこのツールを活用したいと思います。