前置き
1月よりAWS Device FarmではAppium Rubyがサポートされています。過去にAppiumとRSpecの記事を投稿しており、過去のテストコードが活用できるか検証しました。本記事は前記事を振返りながらAndroid版のサンプルアプリで進めていきます。
構成
名前 | バージョン |
---|---|
macOS | Mojave 10.14.4 |
Homebrew | 2.0.6 |
テストコードやテストパッケージなどをGitHubに公開しています。よろしければご覧ください。
テストパッケージの作成
Device FarmでAppium Rubyを利用するには必要なパッケージとテストコードをzipファイルにアーカイブして、Device Farmにアップロードします。AWSのドキュメントに大まかな手順が記載されています。こちらに沿ってテストパッケージを作成していきます。余談ですがこのドキュメントの日本語版は3月から公開されたと思います。
GPGをインストール
$ brew install gpg2
$ gpg --help
gpg (GnuPG) 2.2.14
libgcrypt 1.8.4
Copyright (C) 2019 Free Software Foundation, Inc.
:
:
バグは <https://bugs.gnupg.org> までご報告ください。
RVMをインストール
日頃はRubyのバージョン管理/切替えにrbenvを利用していますが、公式の手順で進めていきます。
-
RVMをインストール
$ gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB $ curl -sSL https://get.rvm.io | bash Downloading https://github.com/rvm/rvm/archive/master.tar.gz Installing RVM to /Users/devnokiyo/.rvm/ : : 👉 Donate: https://opencollective.com/rvm/donate
-
パスを通す
~/.bash_profileexport PATH="$PATH:$HOME/.rvm/bin"
$ source ~/.bash_profile $ rvm -v rvm 1.29.7-next (master) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]
-
Rubyをインストール
$ rvm install ruby 2.5.1 --autolibs=0 Warning, new version of rvm available '1.29.7', you are using older version '1.29.7-next'. You can disable this warning with: echo rvm_autoupdate_flag=0 >> ~/.rvmrc You can enable auto-update with: echo rvm_autoupdate_flag=2 >> ~/.rvmrc : : Ruby was built without documentation, to build it run: rvm docs generate-ri $ ruby -v ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin18]
テストパッケージの土台を準備する
-
ディレクトリ
$ mkdir test_sample && cd $_
-
Gemfile / Gemfile.lock
前記事のサンプルのGemfile / Gemfile.lockを配置します。 -
テストコード
まずは前記事のサンプルのspecディレクトリと中身を配置します。後程Device Farm向けに修正します。
現時点での構成は以下のとおりです。
├── Gemfile
├── Gemfile.lock
└── spec
├── spec_helper.rb # 後程修正します
└── test.rb # 後程修正します
テストコードを修正する
「Device Farm」「エミュレーターではなく実機」という環境の変化によりテストコードを一部修正する必要があります。ここではファイル毎に主な変更点を記載します。githubにコミット履歴を作りましたので詳細はこちらでご確認ください。
spec_helper.rb
Capabilitiesを変更します。
Capability | 修正前 | 修正後 |
---|---|---|
automationName | Appium | UiAutomator2 |
platformName | Android | 環境変数 DEVICEFARM_DEVICE_PLATFORM_NAME |
deviceName | Android Emulator | 環境変数 DEVICEFARM_DEVICE_NAME |
app | ./SampleApp/app-debug.apk | 環境変数 DEVICEFARM_APP_PATH |
appPackage | com.example.devnokiyo.appiumdemo | - |
appActivity | com.example.devnokiyo.appiumdemo.MainActivity | - |
uuid | - | 環境変数 DEVICEFARM_DEVICE_UDID |
avd | Pixel_2_API_28 | - |
環境変数についてはAWSのドキュメントをご覧ください。
test.rb
明示的にidを割当てていないダイアログのタイトルやボタンはAppium Desktopで割出していました。このときはidの一部を省略してコンポーネントを指定していましたが、この状態ではDevice Farmが動作しませんでした。正式なidを指定すると動作します。("android:id/"を付与します。)
id | 修正前 | 修正後 |
---|---|---|
認証エラーダイアログ メッセージ | message | android:id/message |
認証エラーダイアログ OK | button2 | android:id/button2 |
テストパッケージを仕上げる
テストコードパッケージの土台とテストコードの修正が完了したので、テストパッケージの完成をさせます。
-
bundlerをインストール
この記事ではなるべく過去のリソースを流用する主旨もあるのでバージョン1.17.1をインストールします。最新バージョンをインストールするとエラーが起こります。
こちらの記事を参考にさせて頂きました$ gem install bundler -v 1.17.1 Fetching: bundler-1.17.1.gem (100%) Successfully installed bundler-1.17.1 : : 1 gem installed $ bundler -v Bundler version 1.17.1
-
各種Gemをインストール
$ bundle install Fetching gem metadata from https://rubygems.org/.......... Fetching eventmachine 1.2.7 Installing eventmachine 1.2.7 with native extensions : : Bundle complete! 2 Gemfile dependencies, 20 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed.
-
Gemをキャッシュ
$ bundle package Using eventmachine 1.2.7 Using websocket-extensions 0.1.3 : : Bundle complete! 2 Gemfile dependencies, 20 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. Updating files in vendor/cache * eventmachine-1.2.7.gem * websocket-extensions-0.1.3.gem : : * rspec-mocks-3.8.0.gem * rspec-3.8.0.gem
-
Zipでアーカイブ
$ zip -r ../MyTests.zip Gemfile vendor/ spec/ adding: Gemfile (deflated 7%) adding: vendor/ (stored 0%) adding: vendor/cache/ (stored 0%) : : adding: vendor/cache/websocket-driver-0.7.0.gem (deflated 14%)
これでDevice Farmにアップロードするテストパッケージが完成しました。同様のアーカイブをGitHubにもアップロードしておきました。
Device Farmの準備と実行
ここからはDevice FarmをAWSのコンソール(WEB)で操作していきます。
プロジェクトを作成する
Device Farmのページに移動してプロジェクトを作成します。
新しいテストケースを作成する
テスト対象のアプリをアップロードする
前記事のサンプルアプリをアップロードします。当時と全く同じものです。
テストパッケージをアップロードする
テストフレームワークにAppium Ruby
を選択して、前述のいくつかの手順で作成したテストパッケージMyTests.zip
をアップロードします。次の手順でテストスペックのYAMLを修正しますので、まだ「Next Step」を押さないでください。
テストスペックのYAMLファイルを修正する
主な変更点を記載します。テストコードの説明と同様に詳細はこちらでご確認ください。
Capability | 修正前 | 修正後 | 備考 |
---|---|---|---|
Appiumのバージョン | 1.7.2 | 1.9.1 | 1.10でテストしていたので出来るだけ最新バージョンを指定 |
Appiumの引数 | chromedriver-executable | 削除 | |
プログラム実行 | bundle exec ruby YOUR_TEST_FILENAME.rb | bundle exec rspec spec/test.rb | 雛形から実プログラムへ書換え |
YAMLを書換えたら「Save Testspec」を押して適当な名前を付けておきます。
テストする端末を選ぶ
デフォルトのデバイスプールとして「Top Devices」が選択されていました。
よほどOSのバージョンが古くなければ何でも良いと思うのですが、筆者は以下のようにしました。
気分で選びました
余談ですが無料枠は端末の利用時間で減っていくようで、動作時間×端末数で時間がカウントされています。雛形を作っている最中は1つの端末のみを指定して試行錯誤すると良いと思います。
付加情報を指定する
特に指定することがありませんので「Next Step」を押します。
実行の設定をする
特に指定することがありませんので「Next Step」を押します。ただ、ある程度動作確認が取れるまではタイムアウトの時間を小さくすると良いと思います。根拠はありませんが筆者は10分くらいで試していました。
「Confirm and start run」を押して実行しましょう。
Device Farmの動作状況とテスト結果を見る
テストコードが動作しているかをDevice Farmのコンソールで見ていきます。Device Farmのページのスクリーンショットが多く、AppiumとかRSpecはあまり関係のないようにも思いますが、折角なのでテストの進行状況を見てみましょう
通常業務なら「自動テストなんだから放っておく」ことになりますよね。
動作状況を見る
前手順で「Confirm and start run」を押すとテストケースのリストページに遷移します。
-
進捗をグラフィカルに見る
コンソールに表示されているとおり数分待ちます。
端末の画面が表示されました。
テストコードが実行されました。
テストが終わりました。5 examples, 0failures
終わりに
筆者は日頃、UIの自動テストに従事しておらず、UIの自動テストについて定番の構成を理解していません。Device Farm自体の情報量が少ない印象で、更にAppium Ruby RSpecという構成による事例が見当たらなかったので調査してみました。むしろ、これから対応のフレームワークが増えていって利用される機会が増えるのかもしれません。機会があればiOSでも実行できるか確認してみたいと思います。