Intelligent Technology's Technical Blog

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

Appiumでモバイルアプリのテストを自動化【概要編】

【追記2014/7/7】
記事中のAppiumのドキュメントへのリンク先は削除されてしまったようです。その代わりに公式サイトのドキュメントが整備されています。

【追記2014/7/16】
Appiumの新しいバージョン(1.2.0)に関する記事を書きました。

こんにちは、間藤です。

弊社では、数年前にWebアプリケーションの自動テストツールを自前で作成して、いくつかのチームでは現在も利用しています。しかし、最近では、スマートフォンタブレットなどのデバイスから利用することを想定したWebアプリケーション開発案件も徐々に増えており、現在のツールではニーズに対応しきれなくなってきました。
そういった背景もあって、モバイルデバイスの自動テストに関して、情報収集を行ってみましたので、今後数回に分けてなるべく詳しくレポートしてみたいと思います。

Selenium 2.0

数年前、弊社の自動テストツールを開発するにあたり、予備調査としてSeleniumを調査したことがありました。結局その時は、Seleniumを利用することを見送ったのですが、個人的には有望なツールと考えていたので、今回もここから調査を開始することにしてみました。Seleniumはいくつかのプロジェクトに分かれています。

Selenium Remote Control(Selenium-RC)は、以前に私が調査したときからあったプロジェクトで、古い方式と言えます。テストスクリプトは、Seleniumのサーバ(Remote Control Server)を経由してブラウザを操作するという方式です。Remote Control Serverは、テスト対象のWebアプリケーションにJavaScriptを挿入することで、自動テストを実現しています。JavaScriptでの操作になるため、同一生成元ポリシーの制約を受けたりと、実用面にやや問題を抱えていました。

この問題を解決するために生まれたのがSelenium WebDriverです。WebDriverは、もともとGoogleで開発されたものですが、2011年にSeleniumに統合されました。また、WebDriverは、W3Cが標準化を検討しています。

以下、公式ページからの抜粋です。Selenium-RCとのアプローチの違いについて述べられています。

Selenium-WebDriver makes direct calls to the browser using each browser’s native support for automation. How these direct calls are made, and the features they support depends on the browser you are using. Information on each ‘browser driver’ is provided later in this chapter.

For those familiar with Selenium-RC, this is quite different from what you are used to. Selenium-RC worked the same way for each supported browser. It ‘injected’ javascript functions into the browser when the browser was loaded and then used its javascript to drive the AUT within the browser. WebDriver does not use this technique. Again, it drives the browser directly using the browser’s built in support for automation.

つまり、ブラウザの拡張機能などを利用して、ブラウザ操作を実現する方式となっています。そして、このSelenium WebDriverのことをSelenium 2.0と呼んでいます。

Selenium 1.0 + WebDriver = Selenium 2.0

ネット上にSeleniumの情報を探すと、古いものはSelenium-RCについての解説だったりするので、区別して情報収集するよう注意が必要です。以下に、いくつか参考サイトを紹介しておきます。以降では、Seleniumそのものの説明はあまりしないつもりですので、これらのサイトを参考にしていただければと思います。

モバイルデバイスへの対応状況

Seleniumは自動テストのスタンダードになりつつあると考えていますが、モバイルデバイス向けの対応はどうなっているのでしょうか?
以下のページが参考になります。

「Mobile Devices」という項があり、2013/12/16現在、wikiへのリンクが2つ用意されています。

説明は不要と思いますが、Android端末向け、iOS端末向けにそれぞれDriverが用意されているということがわかります。

AndroidDriver

WebViewを内蔵した専用アプリを端末にインストールして、そのアプリを使って対象のWebアプリケーションの自動テストを行います。つまり、Android端末にインストールされているブラウザ(デフォルトブラウザとかChromeとか)を操作する方式ではありません。wikiの記述に従えば動作確認できると思いますが、以下のブログ記事にも情報がありますので、参考にしてください。
※AndroidDriverについては記事の後半に記載されています。

IPhoneDriver

こちらのwikiには冒頭に、

If you are looking to use WebDriver with iOS mobile Safari and are currently testing only on simulators please have a look at ios-driver or appium

と書かれており、「DEPRECATED」になっているようです。
将来的なサポートも期待できませんので、これを今から掘り下げていく意味はほとんどないでしょう。

Appiumという選択肢

ということなので、Seleniumではモバイルデバイス向けにはあまり力を入れていないようなのですが、「Third Party Browser Drivers NOT DEVELOPED by seleniumhq」の項を見ると、サーバーパーティ製のツールがいくつか紹介されています。今回私はこの中でAppiumに注目しました。

f:id:IntelligentTechnology:20131216171213p:plain

今のところiOSAndroid、FirefoxOSの3つのプラットフォームに対応しており、幅広く適用ができそうだと考えたからです。

インストール

私は、OS X Mavericksで動作確認を行っていますので、以降に示す手順もMac上で確認したものになります。

Appium本体は、Node.jsのパッケージですので、Node.jsがインストールされていることが前提です。
npmコマンドでインストールします。

> sudo npm install -g appium

インストール時のバージョンは0.12.0でしたが、リリースが頻繁に行われているようで、動作確認を行っている間に0.12.3にまで更新されていました。バージョン更新を行わずに動作確認していたので、これからの記載は0.12.0に対するものになります。バージョンを更新してから動作確認をする場合は、その旨を書くようにします。
GUI版Appiumも提供されています。2013/12/16現在、公式サイトを見ると、「Download Appium」というリンクが表示されます。このリンクからGUI版をダウンロードすることができます。但し、コマンドベースでAppiumを利用するなら、GUI版のインストールは必須ではありません。

また、テストスクリプトをNode.jsで書く場合は、wdパッケージが必要になるようです。

> npm install wd

Appiumがwdパッケージに依存しているわけではありませんので、これをインストールするかもオプションということになります。

テスト実行環境の構築

テストスクリプトは、Selenium Client & WebDriver Language Bindingsを利用して記述します。各言語のAPIドキュメントも用意されています。テストスクリプトからAppiumに接続するような形態になりますので、例えばJavaであれば、RemoteWebDriverクラスを使うことになります。

File appDir = new File(System.getProperty("user.dir"), "../../../apps/TestApp/build/Release-iphonesimulator");
File app = new File(appDir, "TestApp.app");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
capabilities.setCapability(CapabilityType.VERSION, "6.0");
capabilities.setCapability(CapabilityType.PLATFORM, "Mac");
capabilities.setCapability("device", "iPhone Simulator");
capabilities.setCapability("app", app.getAbsolutePath());
// 第1引数にAppiumのURLを渡している
driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"),
                             capabilities);

テストスクリプトとAppium間のやりとりは、The WebDriver Wire Protocolに従って行われます。Appiumを起動し、作成したテストを実行すれば、動作を確認することができます。

ただ、自分でテストを書くとなると、手軽に動作確認できませんので、サンプルを利用しましょう。
公式サイトのトップページには、「Examples」のリンクがあり、GitHubからサンプルを取得することができますが、こちらはサンプルのみです。「View on GitHub」から辿って、appiumリポジトリをcloneしましょう。サンプルを動作させるのに必要な環境が一式整うからです。

> git clone https://github.com/appium/appium.git

cloneできたら、cloneしたディレクトリに移動して以下のコマンドを実行します。
Xcodeコマンドラインツール)や、Android SDKを事前にインストールしておく必要があります。

> cd appium
> ./reset.sh

実行にはかなり時間がかかると思います。これが正常終了しないと絶対に動作確認ができないというわけではありませんが、なるべく正常終了するまでトライしてください。もし、iOSだけとりあえず試せればよい、という場合には、以下のようにパラメータ指定することで、時間短縮することが可能です。

> ./reset.sh --ios

ちなみに、私はAndroid環境の構築で手間取りました。
JAVA_HOMEとANDROID_HOMEといった環境変数が定義されてなかったり、antがインストールされてなかったりといった簡単に対応できるものもありましたが、一番困ったのはMavenのバージョンです。Appiumは、内部的にSelenroidというツールを利用するようなのですが(詳細は確認できていません)、これをビルドする際に
Mavenを利用しています。Mavenのバージョンが3.1系の場合、ビルドが失敗するという問題があるようです。

私は、当初3.1.1をインストールしていたので、3.0.5に切り替えて対処しました。
この情報に辿りつくまでかなり悩んでしまったので、正常終了するまで時間がかかってしまいました。

次回からiOS

早速テストを実行したいところですが、今回は概要編ということで、ここまでにしたいと思います。
次回は、iOS編ということで、iOSシミュレータと実機上でネイティブアプリをそれぞれ自動実行するシナリオを確認したいと思います。iOS編は、「ネイティブアプリ」「ハイブリットアプリ」「Mobile Safari」の3回に分けて書く予定です。