Maestro × EAS で始める React Native の E2E テスト
Maestro とは?
Maestro は、軽量で高速な E2E(End-to-End)テストフレームワークです。React Native / Flutter / iOS / Android などに対応しています。
YAML形式でシンプルにテストフローを記述でき、ユーザーの操作をそのまま再現するようなテストを書くことができます。公式docが分かりやすいという点も魅力の1つに感じました。
第三者による資料で特に分かりやすいと感じたものを載せておきます。
React Native(Expo)に導入する
expoのE2Eテストに関するdocで、Maestroが紹介されています。
今回は以下の簡素なポケモン図鑑アプリでMaestroを使ってみます。READMEを読めばどんなアプリかイメージできると思います⭐
まずは、eas.json
と同じ階層に作った.maestro
ディレクトリにMastroのテストフローが書かれたymlファイルを配置します。
今回は以下の流れでテストします。
(a) アプリを起動 -> (b) Poke APIからポケモンが取得できていることを確認 -> (c) ピカチュウ(図鑑番号25番)の位置までスクロール -> (d) ピカチュウをタップ -> (e) ブックマークボタンOFFの表示を確認 -> (f) ブックマークボタン押下でローカルDBに保存 -> (g) 戻るボタン押下 -> (h) ブックマークタブに遷移する -> (i) ピカチュウが保存されていることの確認 -> (j) ピカチュウの詳細ページ遷移 -> (k) ブックマークボタンONの表示を確認
これをワークフローに書き起こすと以下になります。
appId: com.rikuyu.pokedex
---
- launchApp # (a)
- assertVisible: # (b)
id: "pokemon-1"
- scrollUntilVisible: # (c)
direction: DOWN
timeout: 10000
element:
id: "pokemon-25"
- tapOn: # (d)
id: "pokemon-25"
- assertVisible: # (e)
id: "bookmark-button-off"
- tapOn: # (f)
id: "bookmark-button-off"
- runFlow: # (g)
when:
platform: android
commands:
- back
- runFlow: # (g)
when:
platform: ios
commands:
- tapOn:
id: "ios-back-button"
- tapOn: # (h)
id: "bookmark-tab-icon"
- assertVisible: # (i)
id: "bookmark-pokemon-25"
- tapOn: # (j)
id: "bookmark-pokemon-25"
- assertVisible: # (k)
id: "bookmark-button-on"
Maestroの構文を知らなくても何をしているのか大体わかると思います。Maestro | Commands を見るとどんな操作ができるのか詳細が分かります。
No need to pepper your tests with sleep() calls. Maestro knows that it might take time to load the content (i.e. over the network) and automatically waits for it (but no longer than required).
Meastroのdocにも書いてある通り、非同期処理を待機する処理を記述しなくても良いことがすごく強力に感じます。
ワークフロー中のid
はReact Native ComponentにPropsとして渡したtestID
の値です。(Textの場合のtestID
のソース react-native Text.d.ts#L190 )今回は、Tamaguiを使っているのですが、TamaguiはReact NativeのPropsもサポートしているのでTamagui製コンポーネントにもtestID
を渡すことができます。
Maestro Studioというものもありますが、筆者は今回使いませんでした。
Maestro をローカルで実行する
プロジェクトのrootディレクトリで以下のコマンドを実行します。(Maestroをインストールしておく必要があります。)
$ maestro test .maestro/bookmark-pokemon-flow.yml
test
をrecord
にすると実行の様子を録画し、mp4で出力してくれます。
$ maestro record .maestro/bookmark-pokemon-flow.yml
以下が実際の動画になります。
EASで実行する
Expo Application Service を使うには、eas.json
が必要なのでeas build:configure
などで生成します。
eas.jsonの記入例
{
"build": {
"e2e-test": {
"withoutCredentials": true,
"ios": {
"simulator": true
},
"android": {
"buildType": "apk" // aabは非対応 で API level 26以上が必要
}
}
}
}
あとはroot/.eas/workflows/
にワークフローファイルを作成するだけです。
ymlの記入例
name: e2e-test-ios
on:
pull_request:
branches: ['*']
jobs:
build_ios_for_e2e:
type: build
params:
platform: ios
profile: e2e-test
maestro_test:
needs: [build_ios_for_e2e] # build_ios_for_e2eの完了を待機
type: maestro
params:
build_id: ${{ needs.build_ios_for_e2e.outputs.build_id }}
flow_path: ['.maestro/bookmark-pokemon-flow.yml']
手動実行したい場合は、eas-cli
で実行します。
npx eas-cli@latest workflow:run .eas/workflows/e2e-test-ios.yml
Discussion