Intelligent Technology's Technical Blog

株式会社インテリジェントテクノロジーの技術情報ブログです。

AppiumでChromeの自動テスト

間藤です。

前回は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を利用して、AndroidChromeで自動テストを行ってみようとしたことがあります。しかしながら、いろいろ調べてみると「端末を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

テストの作成

以前に書いたiOS編と同様、Javaでテストを書きます。

これを以下のように配置します。

> 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バージョンが出力されるはずです。