読者です 読者をやめる 読者になる 読者になる

>& STDOUT

主にソフトウェアに関する日々の標準出力+標準エラー出力

NativeDriverを使ってみた:導入編

ソフトウェアテスト

上層の自動テストFWの大本命、と個人的に勝手に思っているNativeDriverがGoogleからリリースされたので使ってみました。

http://code.google.com/p/nativedriver/

ほとんど Getting Start の下手な訳ですが。入門者さんの参考になれば幸いです。

システム要件

チェックアウトとビルド

$ svn checkout https://nativedriver.googlecode.com/svn/trunk nativedriver --username {Google account e-mail address}
$ cd nativedriver/android
$ ant

antによるビルドが終わると、./android/build 以下に

  • client-prejarjar.jar
  • client-standalone.jar
  • client.jar
  • common.jar
  • server-prejarjar.jar
  • server-standalone.jar server.jar

が出来上がります。

注意

google codeがおかしいのか僕の環境がおかしいのかたぶん後者でしょうけど、checkoutに失敗した結果、ant が BUILD FAILED を吐くことがよくあります。当たり前なのですが。seleniumがまるまる落ちてこないとか、少なくとも2回あったので、この辺ご注意頂ければと思います。

当面使うのは下記の2つ
  • server-standalone.jar
    • テスト対象の Application にリンクして、デバイスやエミュレータの上で実行されます。これは NativeDriver 用のサーバとして、Activity の起動やUIのクリックイベントなどを待ち受けます。
  • client-standalone.jar
    • こちらはテストコードに NativeDriver の Client としてリンクします。サーバと通信するための WebDriver API が実装されています。

Getting Startのwikiにある図解によると、HTTPの上でJSON飛ばすみたいです。ここはWebDriverの頃からそうなのかも。いずれにせよ平易なプロトコルなので、Client側のいじり甲斐がありますね。

準備

1. テスト対象のAndroidManifest.xmlに下記を記載
<instrumentation android:targetPackage="{app_package_name}"
 android:name="com.google.android.testing.nativedriver.server.ServerInstrumentation" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.WAKE_LOCK" />
  <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

手順2でデバイスの準備をする際に adb am に渡す引数は{app_package_name}で指定したものになります。

2. NativeDriverからのリクエストを受信するためにAndroidのデバイスを準備*1

注意!このコマンドは必ず実機なりエミュレータなりでテスト対象を起動してから行って下さい。selenium.HttpConnectionErrorとか、ほぼこれが原因です。

adb shell am instrument {app_package_name}/com.google.android.testing.nativedriver.server.ServerInstrumentation

ツリーをチェックアウトしてくると、"simplelayouts"というサンプルのプロジェクトが入っています。そちらでまず試したい場合は、下記のように入力します。

adb shell am instrument com.google.android.testing.nativedriver.simplelayouts/com.google.android.testing.nativedriver.server.ServerInstrumentation
3.NativeClientが通常のTCPを用いてデバイスと通信するためのポートフォワーディングを設定
adb forward tcp:54129 tcp:54129
注意

この準備はテスト環境をセットアップする度に毎回行う必要があります。端的に言うとeclipseを再起動するたびに。注釈にもありますが、はやくコード上で設定できるようにしたいところですね。

テスト実行

テストプロジェクトを右クリックして Run As->JUnit Test で実行します。構成は”Eclipse JUnit Launcher as the Preferred Launcher”を選択します。いつもの "Android JUnit Launcher" ではないので注意。


テストアプリを使う場合の実行手順の最後に「Watch the device screen to see the magic!」とあるのですが、正直何をテストしてるのか見た目だけではさっぱりわかりません。でも、複数のActivityを行き交ってテストしている様子は確かにこれまでのInstrumentationTestからすると magic! なのかもです。

*1:将来的には拡張AdbConnectionクラスを使用してコードから呼び出せるようになる予定ですが、今のところこの部分は手動で行う必要があります