MaestroというE2Eテスト自動化ツールについて思うことがあるので、書く。
Maestroは、iOS、Android、WebのE2Eテスト実装・実行のためのツールで、以下のような特徴がある:
- 手続型のプログラミング言語の知識なく、YAMLによる宣言的なテストの記述ができる。
- Appium非依存で独自にエンジンを実装し、OSSとして公開されている
- 完全ローカルでテスト実行可能
- Expoのデフォルトテンプレートで採用されている
見た目はこんな感じ
# flow_contacts_android.yaml
appId: com.android.contacts
---
- launchApp
- tapOn: "Create new contact"
- tapOn: "First Name"
- inputText: "John"
- tapOn: "Last Name"
- inputText: "Snow"
- tapOn: "Save"
E2Eテスト実装の経験がある人だったら、パッと見、「あっ、良さそう」と思うのではないかと思う。実際ぼくは思った。なにしろ簡潔で、テストステップの本質だけが抽出されたような見た目をしているので。ただ、各ステップ自体は極限まで簡潔ではあるものの、シナリオがある程度複雑になれば、テストの「意図」を読み解くのは、やはり労力が必要になってくる。まあこれは、どのE2Eツールについても言えることなので、とくだんMaestroがダメということではなく、むしろ簡潔なテキストで表現されているぶん読み解きやすい部類だと思う。
とはいえ、自作のアプリで実際につかってみると、思ったほど便利ではなかった。むしろ本質的にコンセプトがあまりイケてないのではないかという気さえした。YAMLの簡潔なフォーマットというコンセプト自体はなにも文句はない。ただ、エンジンがあまり賢くない。というか、賢いのだけど、賢さが中途半端な感がある。UIのアニメーションがidleになったかどうかとかを見るロジックがあるようなのだけど、それが誤動作して、意図してないところでタップが暴発したりする。そういう挙動に遭遇したときには、試行錯誤がはじまる。Maestroの挙動を観察して、なにが原因なのか突き止める必要がある。もっとも基本の動作となるtapOnにも、実はretryTapIfNoChangeやwaitToSettleTimeoutMsといったオプションが用意されており、それらを適用してみてどうにかして最後までうまいこと進んでくれるシナリオを実装する。
MaestroでのE2Eテスト実装は、はじめの期待とは裏腹に、単に望む結果を羅列しただけだと、期待どおりになってくれなかった。一見簡潔に見えるものの、背後には何らかのロジックがあるらしい。そしてそれはブラックボックスである。結果、使用感としては、使っているというより使われているという感覚になり、ストレスフルだった。それから、Loop、条件分岐、共通部分の外部ファイル化など、抽象化、冗長性排除の仕組みも一通りあるものの、ここでは逆にYAMLによるフォーマットの制約が足枷になり、ぶっちゃけ使い辛い。正直、これを使うくらいなら、ふつうにAppiumのコードをTypeScriptで書いたほうがストレスなく、柔軟に、理想のE2Eテストが書けると思う。
また、YAMLで書けてガチプログラミング言語不要とは言え、それだけだと、QA実装という文脈においていろいろ不都合があることを認識しているからなのか、Maestro Studioという、実際にアプリ画面をさわりながらYAMLを構築できるGUIツールも用意している。ただ、これもなかなか不思議で、現在のところ部分的なコマンドしかサポートしていない。たとえば、inputTextとかがなかったりする。いずれにせよ、Loopや条件分岐なども、このGUIでうまくサポートするのは難しいだろうから、あくまで補助的な立ち位置のツールとなる。もちろん、accessibility IDなどを画面上で簡単に確認できるのはすごく便利ではあるけど、けっきょくYAMLには向き合わなければいけない。中途半端なのかなと思った。
ただ、一個可能性があるなと感じるのは、このYAMLのフォーマットは、LLMに食わせても、たぶんそのまま実行してくれるので、背後のロジックを完全にAIにすげかえてもうまくいくポテンシャルはあるのかなという気がした。まあ、けっきょくAIにやらせるのであれば、このフォーマットでもMaestroでもなくていいかもしれないけど…。