ReactNativeでE2EテストをするDetoxをちょっとだけ触ってみた(iOS)
Detoxというライブラリを使ってE2Eテストを書いてみる
前提
準備
シミュレーターを動かすのに必要なのでインストールする
$ brew tap facebook/fb $ export CODE_SIGNING_REQUIRED=NO && brew install fbsimctl
$ brew tap wix/brew $ brew install --HEAD applesimutils
$ npm install -g detox-cli
テストしたいプロジェクトに導入する
$ npm install detox mocha --save-dev
初期化コマンドを実行すと
./e2e
フォルダが生成されます
続いてビルドコマンドで成功すれば準備完了
$ detox init $ detox build
動かす
$ detox test
を実行すると ./e2e/xxx.spec.js
ファイルが検出されてテストされる
適当な画面を書いて動かしてみた
テストを実行すると、画面が勝手に動き出して
書いたとおりにUIが変更されるかチェックされる
こんな感じのコード
describe('Example', () => { beforeEach(async () => { await device.reloadReactNative(); }); it('テキスト入力', async () => { await expect(element(by.id('welcome'))).toBeVisible(); await element(by.id('textInput')).typeText('Hello!'); await element(by.id('textInput')).clearText(); await element(by.id('scrollview')).tap(); }); it('スクロールしてメニュー開閉', async () => { await element(by.id('scrollview')).scrollTo('bottom'); await element(by.id('menuButton')).tap(); await expect(element(by.id('menu'))).toBeVisible(); await element(by.id('menuCloseButton')).tap(); await expect(element(by.id('menu'))).toNotExist(); }); })
操作対象とのヒモ付は testID
を付ける
対応してるのは View
, Text
, TextInput
, Switch
, ScrollView
で、ラップしてる場合は自分で渡せるようにしないといけない
例えば
<View testID='welcome'> <Text>Hello</Text> <View>
describe('Example', () => { beforeEach(async () => { await device.reloadReactNative(); }); it('初期画面が表示されてる', async () => { await expect(element(by.id('welcome'))).toBeVisible(); }); })
また、要素に対してタップやスクロールというような操作も実行できる
<TouchableOpacity testID='button' onPress={() => {}}> <Text>Touch</Text> </TouchableOpacity>
it('sample', async () => { await element(by.id('button')).tap() // onPressが実行される });
タップ以外の操作もだいたい出来る
- .tap()
- .longPress()
- .multiTap()
- .tapAtPoint()
- .typeText()
- .replaceText()
- .clearText()
- .scroll()
- .scrollTo()
- .swipe()
詳しくはドキュメントへ: https://github.com/wix/detox/blob/master/docs/APIRef.ActionsOnElement.md#methods
所感
testID
埋め込むのがちょっとめんどくさいのと、書き方によって埋め込みが難しいところもある- OSSのアプリに組み込んでみたらビルドエラーで動かなかったり、まだ安定してない感があった
- 動いてる様子を見るのが楽しかった(たぶん最初だけ)
- 使うとしたらコアで操作の多い重要な部分だけ書くのが良さそう
- Androidはまだサポートしてないみたい
参考リンク
- デモ:GitHub - rskull/detoxDemo
- Detox:GitHub - wix/detox: Gray Box E2E Tests and Automation Library for Mobile Apps
- ドキュメント:https://github.com/wix/detox/blob/master/docs/README.md
- トラブルシューティング:detox/Troubleshooting.RunningTests.md at master · wix/detox · GitHub
- 詳しい記事:How to Test your React Native App Like a Real User – Elad Bogomolny – Medium