以下のような感じで環境変数を設定しましょう。すると解消しているはずです。今回使用するサンプルアプリは以下のようなページを持っています。コードの内部実装は詳しく説明しませんが、ソースコードは公開しているので、気になる方はご覧ください。1ページ目はテキストを入力する画面があります2ページ目は1ページ目で入力されたテキストが表示されます。ボタンを押すことで内容が変わります3ページ目は画像が配置されたWebViewで、画像をクリックするとSafariに遷移します4ページ目は空のページです5ページ目は動画が配置されたWebViewで、動画をクリックするとSafariに遷移しますアプリを取得するGitHubにてapkとappを公開してますが、自分でビルドしたい場合はexpo経由で以下のコマンドを実行してください。build:android直接ダウンロードする場合https://github.com/minakawa-daiki/AppiumJestSample/releases/tag/v1.0また、生成されたアプリはappフォルダ直下にAppiumJestSample.appとAppiumJestSample.apkでそれぞれ配置してください。(AppiumJestSample.app.zipを解凍してご利用ください)テスト自動化対象端末のconfigを設定する今回はテストコードを書く上のドライバーとしてwebdriverioを採用していますので、jest-environment-webdriverioというライブラリを使用しています。https://www.npmjs.com/package/wdwebdriverioを採用した理由は、非同期処理をより綺麗に書ける点もありますが、執筆時点のwdでは動画撮影周りにバグがあったため採用を見送りました。jest-environment-webdriverioのおかげで、webdriverioの設定を簡単に記述できます。実際に見てみましょう。必要な設定はtestEnvironmentにjest-environment-webdriverioを指定し、testEnvironmentOptionsに端末情報を記述するだけです。iOSでは以下のような設定になります。Simulatorに存在する端末を指定しますautomationNameは実際に使用するUIテストフレームワークを指定しますwdaLocalPortは並列化するときに違うポート番号を指定しますappはiOSのアプリケーションのpathを指定しますAndroidはこんな感じです。Emulatorを指定しますavdはエミュレータのnameのスペースを_で埋めたものを記述しますsystemPortは並列化するときに違うポート番号を指定しますまた、実機を接続してる場合は、以下のような設定で動かせます。}}自動テストを動かす初回は自動化するためのアプリをインストールするため、時間がかかります。テストが失敗することが多々あるので、その場合は再度実行しましょう。実行し、Appiumサーバーを立ち上げておきましょう。testで動作します。デフォルトはiOSが起動します。test:iosを実行してください。テストが開始されると、シミュレータやエミュレータが起動し、テストが行われます。全てのテストが終わったら、tests/screenshotsにテスト途中のスクショや全体の動画が以下のような感じで保存されていると思います。Appiumのスタイルはjestなどのテストフレームワークで表示チェックを担保するのと、スクリーンショットや動画なのでアプリの全体的な動きのテストを担保することで自動化していくのが良いと思っています。無理に全てテストコードで担保しようとせず、スクリーンショットや動画も積極的に使っていきましょう。テストコードの説明まず、ReactNativeとNativeで書かれたコードのテストコードは結構違う感じになることを念頭に置いておいてください。今回はほんの一部しか機能を紹介しないので興味を持った方はドキュメントを見てみると良いでしょう。http://appium.io/docs/en/commands/element/find-element/それに加え、テストコードを書くときにはアプリ内のそれぞれのElementに対してaccessibilityLabelを振っておくと要素を特定しやすくなるのでオススメです。{}});動画は簡単に撮れます。})で撮影を開始した後、browser.stopRecordingScreen()で結果を保持し、後はデコードして書き出すだけです。ffmpegをインストールしておくのを忘れずに。browser.saveScreenshot(`${baseResultPath}/page1.png`);});browser.$('~slide1')).elementIdでundefinedとならない場合、そのページは確かに存在している。いう風にしてテストを担保しています。これは各ページで行っています。browser.saveScreenshot('${baseResultPath}/page1.png')でスクリーンショットを保存しています。}}ここでは、1ページにて、文字を入力し、それが2ページ目で入力された内容が表示されているかどうかのテストを行っています。textInputElement.addValue('おりばー')とすることで、textInputElementに対して「おりばー」という文字が入力されます。browser.hideKeyboard()でキーボードを閉じることができるのも意外と盲点だったりします。swipe('left')はスワイプを行なっています。iOSとAndroidでスワイプの仕方が様々あるので、気になる方はコードを読んでみてください。browser.$(~${inputText})ここの部分はコメントにも書いているのですが、iOSの特定のバージョンにおいて、getText()がaccessibilityLabelで指定した内容になってしまうというバグが存在しています。Xcodeのバージョンも大きく関係しているらしいです。詳しくはコメント欄をご覧ください。その応急処置として、accessibilityLabelにそのまま値を入れるという実装になってしまっています。textInputResultElement.getText()).not.toBe(inputText);});ここではtextChangeButtonElement.click()でボタンをタップして、文字の内容が変わっていることをテストしています。}});3ページ目では存在確認に加え、「画像をクリックして、別アプリに行った後、戻ってこれることを確認」しています。別アプリに遷移してしまった後はAndroidとiOSとで指定の仕方は変わるのですが、それぞれ以下のコマンドで可能になっています。browser.saveScreenshot(`${baseResultPath}/page5-2.png`);});5ページ目では動画が自動再生されますので、スクリーンショットを撮って、しっかりと再生されているかをチェックしています。こんな感じでスクリーンショットを撮りつつ、テストを実行していく流れになります。今回のテストの中で、Androidの場合はChromeDriverを利用するのですが、ChromeDriverはChromeのバージョンと強く紐づいています。本来であればAndroidのChromeバージョンによって使い分けなければいけないのですが、Appiumの起動時にchromedriver_autodownloadと指定することで、Appium側でそこをよしなにやってくれています。すごいですね!並列化について並列化はwebdriverioが提供しているものもありますが、それを利用して並列化すると特定の端末のテストが落ちたときに全てのテストが失敗してしまうことになるのでオススメはあまりしないです。自分で別プロセスでそれぞれ実行して並列化させることをオススメします。並列化するときの注意点はiOSの場合はwdaLocalPortを、Androidの場合はsystemPortをずらして実行することです。終わりにアプリのテスト自動化はAppiumのおかげで想像よりかは書きやすいです。バグも多く潜んでいるので、根気よく戦っていく形にはやっぱりなってしまいます。無理して全てを自動化するのではなく、今手動でやっているテストを少しでも簡単にしようという目線で、少しずつ自動化していくことが良いのではないかと思います。皆さんもAppiumに触れてみてください。requestStockLike15おりばー@minakawa-daiki常に本気https://minakawadaiki.comFollowFringe81株式会社Fringeは、最新のテクノロジーとプロフェッショナルによるサービスにより、社会課題に仮説を立てて市場に広げていくことで、数十年という長期的なスパンで価値を生み出し続け、より良い世界を創る集団です。既存の領域に限らず、時流を読み、仮説を生み出し、テクノロジーの力で優れたサービスを生み出し続けます。upLoginユーザーは見つかりませんでした。