UIテストツール「Maestro」の真実を告白します!

エクストーン Androidエンジニアの市橋です。

今回はモバイルアプリ専用のUIテストツール「Maestro」を実際に使ってみた上での自身の見解について書いていきたいと思います。

Androidアプリの開発が進むにつれて、アプリの品質を確保するためにUIテストは非常に重要な役割を果たします。UIテストを効率的に行うためのツールは数多くありますが、どれを使うべきか迷っている方も多いのではないでしょうか。

そんな中で、個人的に推しているのがMaestroです。

この記事では、実際にMaestroを使ってみた感想をもとに、そのメリットとデメリットを独断で紹介します。Maestroがどのように役立つか、そしてUIテストツール選びにおける選択肢の一つとして検討すべきかを考える材料になればと思います。

Maestroとは?

Maestroとは、モバイルアプリ専用のUIテストツールです。 無料から多くのことができる優れものです。

以下4つのプラットフォームに対応しています。

  • Android(ViewとJetpack Compose両方)
  • iOS(UIKitとSwiftUI両方)
  • Flutter
  • ReactNative

Appium、Espresso、UIAutomator、XCTestのUIツールから学んだ知識に基づいて構築されており、YAML形式で直感的かつシンプルにUIフローを記述できるのが最大の特徴です。

詳細は以下をご覧ください。

maestro.mobile.dev

使ってみた感想

今回はバージョン1.36.0で使用しました。最新バージョンはこちらから確認できます。

メリット

簡単にセットアップできる

Maestroはセットアップの手軽さが大きな強みだとまず感じました。

例えば、AndroidのUIテストツールで有名なEspressoでは依存関係を追加した上で、プロジェクトにGradle同期するというプロセスを踏みますが、Maestroはもっとシンプルです。

以下のコマンド1つ実行して、インストールするだけ(環境変数の設定は除く)です。

curl -Ls "https://get.maestro.dev" | bash

これで早速Maestroを使える状態になります。

弊社案件でもチームメンバー全員が躓くことなく、スムーズに数分程度で導入できました。

直感的にフローを記述できる

Maestroは、UIテストのシナリオを非常に直感的に記述できる印象を素直に感じました。

YAML形式でテストフローを定義するため、理解しやすく、すぐにテストシナリオを書き始めることができます。

例えば、以下のようにログインフローをシンプルに記述することができます。

- launchApp: "com.example.myapp"  # アプリ"com.example.myapp"を起動
- tapOn: "Login"                  # "Login"ボタンをタップ
- inputText:                      # ユーザーネームフィールドにテキストを入力
    id: "usernameField"           
    text: "test_user"            
- inputText:                      # パスワードフィールドにテキストを入力
    id: "passwordField"           
    text: "password123"           
- tapOn: "LoginButton"            # "LoginButton" をタップしてログイン

一方で、Espressoでは以下のように記述します。

@Test
fun testLoginFlow() {
    // アプリを起動
    val activityScenario = ActivityScenario.launch(MainActivity::class.java)

    // "Login"ボタンをタップ
    onView(withText("Login")).perform(click())

    // ユーザーネームフィールドにテキストを入力
    onView(withId(R.id.usernameField)).perform(typeText("test_user"))

    // パスワードフィールドにテキストを入力
    onView(withId(R.id.passwordField)).perform(typeText("password123"))

    // "LoginButton"をタップしてログイン
    onView(withId(R.id.LoginButton)).perform(click())

    // アクティビティが閉じたらシナリオを終了
    activityScenario.close()
}

Maestroと比較すると、横に入れ子状態が続き、かつ記述するコード量が多いので、書きにくい・読みにくいという事案が発生しがちです。

どこの要素をどんな風に操作して、何を確認するのかが分かりやすいMaestroに軍配が上がるなと感じました。

よって、UI操作を視覚的に直感的に捉えながらフローを構築できるのは、開発者にとって非常に助かるポイントだと思います。

Maestro Studioがサポートしてくれる

Maestroには「Maestro Studio」という、GUIでテストシナリオを提案してくれるツールも用意されています。このツールを使うと、テストケースの作成や編集をコードを書くことなく行うことができ、スムーズにUIテストを組み立てられます。

上記の説明にもあった通り、ただでさえ直感的で書きやすいのに、更にそれを促進してくれるイメージです。

Appium、Espresso、UIAutomatorにも補助的なツールはありますが、どれもUIが複雑で、使い辛いなとずっと思ってました。一方で、Maestro Studioは画面構成がシンプルで、誰でも簡単に操作できるUIだと感じました。

以下のコマンドを叩いてMaestro Studioを立ち上げます。

maestro studio

例えば、Android端末の電卓アプリだとこうなります⇩

自動で検知される要素をタップすると、操作の詳細情報が表示されます。

弊社のCompose案件で、対応するComposableのIDを把握できず、一々コードを見て確認しようとしてました。しかし、このMaestro Studioが要素のIDを自動で検出してくれたおかげで、この手間を省いてくれて非常に助かりました。

このように、視覚的なフィードバックを得ながらテストフローを設計できるため、効率的にテストシナリオを作成できるのがポイントです。

基本的なUI操作が網羅されている

Maestroは、基本的なUI操作をしっかりと網羅しています。

例えば、以下のようなAppium、Espresso、UIAutomatorにも存在するUI操作の記述がしっかりあり、リアルなユーザー操作に近いテストがMaestroでも実現できます。

  • アプリ起動
  • アプリ停止
  • タップ
  • スクロール
  • スワイプ
  • テキスト入力
  • コピー&テキスト

シンプルさをアピールするMaestroですが、条件分岐やループも適宜できるので、比較的細かい操作まで網羅したテストシナリオを作成することも出来ます。

- runFlow: # "商品"が表示されたときのフローを実行
      when:
          visible: "商品"
      commands:
          - tapOn: "商品"
          - assertVisible: "カートに追加"
- repeat: # 5回繰り返すスワイプ操作
      times: 5
      commands:
          - swipe:
                direction: "LEFT"

弊社のある案件では、アプリ全体の約6〜8割の部分はMaestroでUIテストをカバーすることに成功しました。

このような直感的でシンプルなツールやフレームワークほど対応できないことが多い印象を受けがちですが、アプリの構成にも勿論よりますが、Maestroで対応できることが多いというのが実際導入して素直に感じたことになります。

因みに、こちらでテストシナリオに関するUI操作や検証、スクリーンショット操作等のコマンド一覧を確認できます。

デメリット

CI/CDと連携する場合は費用が高くなるリスクがある

Maestroでは基本的にローカルで使用する分には無料で利用できるのが魅力ですが、CI/CDに組み込んで自動化したい場合などは「Maestro Cloud」というサービスと連携することが推奨されています。

このMaestro CloudでCI/CDを行うには、1テストフローごとに$0.1(執筆時点では14.41円)がかかります

他のサービスと比べても、結構高い印象を受けました。

要はテストするほどコストが増す従量課金制のため、知らずに使っているといつの間にか費用がかさむリスクがあります。

なので、無料のローカル対応で一旦対応できないかを検討してみるのが良いなと感じました。ただ、公式で価格計算ツールも用意されているので、そちらを利用してから判断するのもありだと思います。

console.mobile.dev

弊社案件ではリソースの優先順位的にMaestro Cloudを使用せず、ローカルで実行しようという方針に至りました。

現時点で対応していないUI操作がある

例えば、以下のUI操作は執筆時点ではMaestroではサポートされていません。

  • ドラッグ&ドロップ
  • ピンチイン/ピンチアウト
  • 日本語でのテキスト入力

この辺は多くのアプリが想定するUI操作でよくあるものなので、完全なデメリットと言えるかもしれないです。

直感さ・シンプルさが売りなMaestroなので、開発したアプリのUIテストを全て賄えるほどには至っていないのが現状なのでしょう。

自身が対応したプロジェクトでも、重要な機能の1つにドラッグ&ドロップ操作があったので、この辺は手動でやらざるを得なかったです。

また、日本語でのテキスト入力ができないため、わざわざ英語での入力しかできなかったのはテストの幅が効かない意味でも不便さを感じました。

どのような操作や評価が出来るのか、あるいは出来ないのかは事前にドキュメントを確認して把握しても良さそうです。

WebViewに弱い傾向にある

MaestroはWebViewコンポーネントの操作に関しては対応が限定的であるなと感じました。Appium、Espresso、UIAutomatorでは感じなかったので、デメリットとして挙げました。

要はWebView内での要素を適切に検知できず、テスト自体失敗するケースがあります。ただ、何度か同じテストの実行を繰り返すとテストが成功することもあり、弊社の案件ではそのままゴリ押しで使っている関係で、安定性に欠け、使い勝手が悪いなと思いました。

因みに、MaestroのGithubリポジトリでIssueとして報告もされておりました。是非とも修正して頂きたい事案ではありますね。

github.com

このような制約により、WebViewベースのアプリを多用している場合には、MaestroだけでUIテストを完了させるのが難しくなることも頭の片隅に入れておく必要がありそうです。

おわりに

今回の記事では、実際に使った経験をもとにMaestro️️について紹介しました。

Maestroは現在進行形のツールであると思ってます。なので、今回自身が感じたデメリットを含めて、現時点では弱点もあります。

しかし、無料でもメリットをしっかりと享受できる場面は多いので、十分にUIテストツールの選択肢の1つになり得るのではないかと考えています。

ぜひこの記事をきっかけに検討してみてはいかがでしょうか。

自分もまた弊社でMaestro️️をより最大限活用できるように粛々と励んでいきたいと思います。ありがとうございました。