ネイティブアプリケーションの UI テストツール「NativeDriver」について
2011年6月29日水曜日
[この記事は、Google Open Source Blog の記事 “Introducing Native Driver” をソフトウェアエンジニアの海津 智宏が翻訳・加筆したものです。-山崎]
Android 向けアプリケーションの開発をもっと快適にするため、Google 東京オフィス発の新しいツールが公開されました。今回は、Android 向けアプリケーションなどを対象とした UI テストツール「NativeDriver」をご紹介します。
NativeDriver は、WebDriver API を利用して、Web アプリケーションではなくネイティブアプリケーションを自動で操作できるツールです。先日 Android バージョンが公開され、Google Code サイト (http://nativedriver.googlecode.com/) からダウンロード可能となりました。Android だけではなく、iPhone バージョンも現在開発中です。
WebDriver はブラウザを操作してウェブアプリケーションをテストするツールです。オブジェクト指向の洗練された API が特徴であり、Firefox、Chrome、Internet Explorer といったデスクトップのブラウザだけでなく、Android や iPhone 上のブラウザでも動作します。WebDriver は、Google の提供しているサービスのテストにも活用されています。
私たちは、この WebDriver の API をウェブアプリケーションだけではなくネイティブアプリケーションでも活用できないかと考えました。ネイティブアプリケーションのテストに WebDriver API を利用する理由としては、次のような点が挙げられます。
- クリックやキー入力などのユーザー操作は、Web アプリケーションとネイティブアプリケーションで共通点が多い。
- 同じアプリケーションをウェブ用とネイティブ用の両方で提供する場合があり、API が共通であればテストケースを流用しやすい。
- 既に WebDriver を利用している開発者であれば、新しい API を覚える必要がない。
- WebDriver 用に開発された既存のツールを活用できる。
NativeDriver のテストケースは次のようになります。このテストは、Android 向けの Google Maps アプリケーションを起動し、画面上のボタンのタップやデバイス上の戻るボタン押下を再現します。
AndroidNativeDriver driver = new AndroidNativeDriverBuilder()
.withDefaultServer()
.build();
driver.startActivity("com.google.android.maps.MapsActivity");
// 検索ボックス右のプレイスボタンをクリックし、
// Places アクティビティを開く。
AndroidNativeDriver btn
= driver.findElement(By.id("btn_header_places"));
btn.click();
// Android デバイスの戻るボタンを押し、Places アクティビティを閉じる。
driver.navigate().back();
// Android デバイスを回転し、画面をランドスケープモードで表示する。
driver.rotate(ScreenOrientation.LANDSCAPE);
[Android の実機でテストを実行している様子]
このテストケースを見ると、アプリケーションの起動に startActivity メソッドを使っている点と、NativeDriver の初期化に Builder を使っている点以外は、WebDriver のテストケースとまったく同じであることがわかります。
Android NativeDriver は、アプリケーションを操作するために内部的に Instrumentation を利用します。Instrumentation は Android の標準機能ですが、課題もあります。例えば、Instrumentation では同時に 1 つのプロセスしか操作することができません。これは、Instrumentation がデバイス内部で動作することに起因します。アプリケーションが他のプロセスを操作できてしまうと悪意のあるアプリケーションに不正にデバイスを操作される危険性があるため、そのようなふるまいは禁止されているのです。そこで、Android NativeDriver は、Instrumentation だけでなく必要に応じて Android Debug Bridge (ADB) 接続も利用できるようにしました。ADB はデバイス外部からの接続であり、特定のプロセスに依存せずにイベントを送信できます。これにより、アプリケーションが他のアプリケーションに処理を委譲するような場合でも処理を継続できるようになっています。また、スクリーンショットを撮る機能でも ADB 接続を利用しています。Instrumentation と ADB 接続をシームレスに使い分けられる点も、Android NativeDriver を利用するメリットのひとつです。
Google Code サイトでは、Android NativeDriver のチュートリアルを公開しています。また、利用者向け/コントリビュータ向けのメーリングリストを用意しています。Android 向けアプリケーションの開発者の方はぜひ試してみてください。