間藤です。
前回はSelendroidについて取り上げましたが、モバイルの自動テストの本命は以前にも取り上げたAppiumではないかと思います。Selendroidについてざっと確認した後、その勢いでAppiumの最新バージョン(1.2.0:2014/7/7現在)の動作確認もしてみました。今回はさほど時間もかからずに確認できたので、簡単にメモを残しておこうと思います。
なお、確認した環境は以下の通りです。
ホストPC | OS X Mavericks v10.9.4 |
Node.js | v0.10.29 |
Appium | 1.2.0 |
Android(実機) | Android4.4.2(Nexus10) |
Chrome | 35.0.1916.141 |
今回のゴール
今回は、Android端末のChromeを使って自動テストを行うことをゴールにします。
AndroidDriverやSelendroidでは、WebViewを持った専用のアプリ(WebViewベースのアプリ)を端末にインストールし、そのアプリ上でWebページの自動テストを行うという形態でした。Appiumでは、そのような専用アプリではなく、Chromeを使って自動テストを行えるようになっています。但し、Android4.2以降に限定されるようです。私は今回Android4.4で試したので、これより前のバージョンでの確認は行っていません。
実は、以前にChromeDriverを利用して、AndroidのChromeで自動テストを行ってみようとしたことがあります。しかしながら、いろいろ調べてみると「端末をroot化する必要がある」ということだったので諦めていました。今回あらためてChromeDriverのサイトを見てみると、以下のような記述を見つけました。
Device Requirements
As of Chrome version 33, a rooted device is no longer required. If running tests on older versions of Chrome, devices needed to be rooted as ChromeDriver required write access to the /data/local directory to set Chrome's command line arguments.
つまり、Chromeのバージョン33以降は、root化が不要になったようです。なお、Appiumは、内部的にChromeDriverを利用しています。
準備
私は以下のような手順で実行環境を構築しました。
※Node.jsはv0.10以降が必要との記載がありました。
Appiumのインストール
まず、npmでAppiumをインストールします。
> npm install -g appium
インストールされたバージョンは以下のようにして確認できます。
> appium --version 1.2.0
Appiumのリポジトリをclone
以前にも書いたように、appiumのリポジトリをcloneして利用するのが、動作確認を始めるには楽ではないかと思います。
> git clone https://github.com/appium/appium.git
必要な環境が整っているかを調べるためのスクリプト(appium-doctor)があるので、それを実行して足りないものがあれば対応します。なお、私の環境のMavenは3.0.5です。ドキュメントには3.1.1以降と記載されていますが、私が昨年末ごろに試した際には、3.1系だとビルドに失敗するという問題がありました。今回3.1系でリトライしていません。3.0.5のままで特に問題なく動作しました。
> appium-doctor -–dev Running iOS Checks ✔ Xcode is installed at /Applications/Xcode.app/Contents/Developer ✔ Xcode Command Line Tools are installed. ✔ DevToolsSecurity is enabled. ✔ The Authorization DB is set up properly. ✔ Node binary found at /usr/local/bin/node ✔ iOS Checks were successful. Running Android Checks ✔ ANDROID_HOME is set to "/Users/matoh/adt-bundle-mac-x86_64-20131030/sdk" ✔ JAVA_HOME is set to "/Library/Java/JavaVirtualMachines/jdk1.7.0_55.jdk/Contents/Home." ✔ ADB exists at /Users/matoh/adt-bundle-mac-x86_64-20131030/sdk/platform-tools/adb ✔ Android exists at /Users/matoh/adt-bundle-mac-x86_64-20131030/sdk/tools/android ✔ Emulator exists at /Users/matoh/adt-bundle-mac-x86_64-20131030/sdk/tools/emulator ✔ Android Checks were successful. Running Dev Checks ✔ mvn was found at /usr/local/apache-maven-3.0.5/bin/mvn ✔ adb was found at /Users/matoh/adt-bundle-mac-x86_64-20131030/sdk/platform-tools/adb ✔ ant was found at /usr/local/bin/ant ✔ android-16 exists at /Users/matoh/adt-bundle-mac-x86_64-20131030/sdk/platforms/android-16 ✔ android-18 exists at /Users/matoh/adt-bundle-mac-x86_64-20131030/sdk/platforms/android-18 ✔ Dev Checks were successful. ✔ All Checks were successful
必要な環境が整っているようであれば、以下のコマンドを実行します。環境設定が不足している場合は、途中でエラーになることがありますので、エラーログを見て対応し、再実行します。私は、一度Appiumの実行環境を作ったことがあったので、特にエラーに遭遇することなくここまでの準備を終えることができました。
> ./reset.sh -–dev
テストの作成
これを以下のように配置します。
> ls sample-code/examples/java/junit/src/test/java/jp/co/iti/test AndroidChromeTest.java
テストの実行
まず、appiumのサーバを起動します。
> appium
iOS編では、実機確認の際、使用する実機のUDIDをサーバ起動時に指定するなど、少々手順が面倒でしたが、Android実機を利用するにあたってはそのようなことはないようです。
テストの実行にはMavenを使います。
> cd sample-code/examples/java/junit > mvn test -Dtest=jp.co.iti.test.AndroidChromeTest
うまく動けば、端末上でChromeが起動し、指定したURLにアクセスして、テストに記載した動作を再現します。
その他のテスト
appiumのリポジトリには、いくつかテストのサンプルが付属しています。これらについても少しコメントしておきます。
AndroidWebViewTest
実はこのテスト、Selendroidに付属しているサンプルアプリ(ネイティブアプリ)がテスト対象になっています。Appiumは、Androidの古いバージョンについてはSelendroidに依存しているようです。その関係でSelendroidのサンプルアプリがテスト対象となっているのかなと思います。
私の環境でこのテストを実行してみたところエラーになってしまいました。
> mvn test -Dtest=com.saucelabs.appium.AndroidChromeTest
Appiumサーバのログを確認すると、以下のようなエラーが出ていました。
error: Failed to start an Appium session, err was: Error: Could not find aapt in tools, platform-tools, or supported build-tools under "/Users/matoh/adt-bundle-mac-x86_64-20131030/sdk"; do you have android SDK or build-tools installed into this location? Supported build tools are: 17.0.0, 18.0.1, 19.0.0, 19.0.1, 19.1.0, 20.0.0, android-4.2.2, android-4.3, android-4.4
該当バージョンのAndroid SDK Build-toolsがインストールされていないことが原因でした。SDK Managerでインストールして再実行したところ、うまく動作するようになりました。
rubyのテスト
サンプルには、様々な言語で書かれたものが提供されていますが、今回試しにrubyのテストも動かしてみました。少々ひっかかったところもあったので、以下にメモしておきます。
まずテストに必要なgemをbundlerでインストールしましょう。私はパスを指定してインストールしました。
> bundle install --path vendor/bundle
もし、プロキシを設定しているようでしたら、no_proxy環境変数が設定されていないと、Appiumのサーバに接続できなくなります。設定されていないようでしたら、例えば以下のように設定します。(最低限'127.0.0.1'を含めてください)
> export no_proxy=127.0.0.1,localhost,192.168.1.1
今回はxunit_android.rbを実行してみます。但し、このサンプルではcapabilitiesにdeviceNameが指定されていませんでした。これがないとエラーになってしまうので、追加してください。(Appiumのサーバ起動時にパラメータで指定しておくことも可能です)
def setup caps = { caps: { platformName: 'Android', appActivity: '.Settings', deviceName: 'Android Emulator', appPackage: 'com.android.settings' }, ・・・
このサンプルのシナリオは、設定画面からAndroidのバージョンを取得してコンソールに出力するものです。画面上の要素を探索する際、文字列指定していますが、元のサンプルは英語表記を前提としているので、お使いの端末に合わせて文字列を変更しておきましょう。
def test_about_phone_version scroll_to('タブレット情報').click android_version = 'Androidバージョン' ・・・
これで実行の準備ができたので、以下のコマンドでテストを起動します。
> bundle exec ruby xunit_android.rb
うまく動作すれば、コンソール画面に端末のAndroidバージョンが出力されるはずです。