【超訳】AndroidのUIをUnitTestできるNative Driver

Introducing Native Driver超訳


Native DriverはWeb Driver APIの実装で、WebアプリケーションではなくネイティブアプリケーションのUIを叩くもの。Android版がダウンロード出来るようになったので、ユーザとコントリビュータをゆっくり募集。Google Code (http://nativedriver.googlecode.com/ )に置いてある。iPhone(iOS)版も開発中でもうすぐ使える。


WebDriverはブラウザの機能を綺麗でオブジェクト指向APIとして見せてくれるので、Googleでは多くのプラットフォーム上でWebアプリケーションをテストするのにWebDriverを使っている。(WebDriverについては、このブログ記事を参照)


なぜWebDriver APIをネイティブアプリケーションに使うのか不思議に思うかもしれない。理由としては、

  • ネイティブアプリケーションもWebアプリケーションも、ユーザとのやり取りは基本同じ:
    • クリック、キー入力、ウィンドウ切り替え、テキストを読む。
  • テストの記述者はサポートしたいそれぞれのプラットフォームごとに同じテストを書かなければいけない。
  • また別のAPIを誰も学習したくはない。
  • WebDriverはすでにユーザ層がありツールのエコシステムもある。WebDriverに似たAPIなら簡単に統合できる。
  • つまり: お気に入りのUIテストAPIを再利用しよう。


NativeDriverは、WebDriverのすっきりしたところと成功しているところをネイティブアプリケーションにも持ってこようという試み。WebDriver APIをいくつかのキーとなる所で拡張をして、ネイティブアプリケーション用に既存のAPIを再翻訳している。


Android用のGoogle Mapsアプリケーションに対するNativeDriverのテストのコードはこんな感じになる。(テスト風景は動画が見られる)

AndroidNativeDriver driver = new AndroidNativeDriverBuilder()
	.withDefaultServer()
	.build();
driver.startActivity("com.google.android.maps.MapsActivity");

// placesボタンをクリックしてPlacesアクティビティを開く
// (検索ボックスの右)
AndroidNativeDriver btn = driver.findElement(By.id("btn_header_places"));
btn.click();

// Placesウィンドウを閉じる
// Androidの戻るボタンを押すのと等価
driver.navigate().back();

// 横画面を表示するために回転する
driver.rotate(ScreenOrientation.LANDSCAPE);


startActivityメソッドとドライバーを作るオブジェクトビルダーの使い方以外、すべてのAPI呼び出しは、標準のWebDriver API呼び出しで出来ている。Android Debug Bridge(ADB)接続と一緒にドライバーを準備するので、ビルダーでドライバーを作る必要がある。


AndroidのNativeDriverはInstrumentationを使ってテスト対象のアプリケーションを監視、操作する。InstrumentationはAndroidの標準機能だが、いくつか制限がある。例えば、別プロセスの一部であるUIを叩けない(もしそんなことが出来たら、悪意のあるアプリケーションが端末を乗っ取れてしまう)。ADBが解決してくれるのはまさにそこ。ADBは外部からの接続で、特定のアプリケーションと括り付いていないので、アプリケーションをまたいでイベントを挿入できる。ADBでスクリーンショットも撮れるし、NativeDriverを改良するにつれて新しいやり方で使っていく予定。標準のInstrumentationテストより、AndroidのNativeDriverのテストが強力な理由でもある。


AndroidのNativeDriverは今すぐ試せるし、サンプルテストを走らせたり自分のアプリにInstrumentationを入れられる。あと、ユーザML開発者MLに参加して。


ネイティブのテストが楽しくなるよっ!じゃ!

感想: ドライバーとかネイティブって単語の使い方が異次元。