Hack the World!

プログラミングや,ネットワークに関する話題を取り扱っています.知識をつけて,優雅にお仕事するのを目指しています.

Android UIAutomatorTestCase その3

2012/11/16 追加: ビルドまでは完了
2012/11/28 追記: 動きました!


4.2が出た所?で、ドキュメントもいつの間にか変わってました。

http://developer.android.com/intl/ja/tools/testing/testing_ui.html
http://developer.android.com/intl/ja/tools/help/uiautomator/index.html

改めて、紹介すると、HierarchyViewer と MonkeyRunner と似たような位置づけ、という理解でいいようです。
但し、前回も述べたように、MonkeyRunner とはそもそもの仕組みが違うので、
ケースバイケースで使い分けでしょうか?


で、API Level 16 / SDK r21 から使えるよ!とのことです。

                                                                                                  • -

上のドキュメントを要約しておくと、以下のとおりになります。

概要
 アプリケーションのテストとは、Activityだけでは充分ではなく、ダイアログやメニュー等もあり、
 機能テストだけでは充分ではありません。
 機能を操作するのではなく、UIから操作する必要があります。

 機能テストにしても、UIテストにしても、「ブラックボックステスト」を行う場合は
 プログラムの中身に精通している必要はありません。
 適切に役割を分割し、開発をすることで恩恵を受けられます。
 
 しかし、MonkeyRunnerの様な(とは書いてませんが)、形のテストツールでは
 実行のタイミングなどにより、エラーになってしまいます。
 本ツールでは、テストフレームワークを用いたシナリオをベースにしたテスト方法を提供します。

 本ツールを利用して、様々な解像度のテストや、着信や別アプリなどの遷移を行うようなテストを実行する事で
 最大限のメリットを得ることができます。

注意点
 Text Label または、Contents Description 等を元にアクセスをします。
 uiautomatorviewer (Eclipseデバッグからも起動可能)を元に、上記の値を確認・実装しましょう。


uiautomatorviewer に関しては、特に説明するまでも無さそうなので説明は割愛します。

                                                                                                  • -
  1. Eclipse の設定
  2. テストの記述
  3. テストのビルド
  4. テストの実行
                                                                                                  • -

1. Eclipse の設定

Java プロジェクト」を作成し、以下のような設定をします。

Junit3 は、Add Library から
android.jar と uiautomator.jar は、自分の対象とする端末のバージョンに依存します。

ANDROID_SDK のディレクトリから、platforms/android-[api level] 等のディレクトリから選択してください。


2.テストの記述

UIAutomatorTestCase : JUnit同様のテストケースクラス

                                        • -

UIDevice : MonkeyRunner に似た感じの、端末自身を操作する為のクラス
UISelector : UIを指定する際に使うクラス
UIObject : UI のパーツを表すクラス
UIScrollable: スクロール可能なUIパーツを表すクラス
UICollection: 子要素を持つようなUIのパーツを表すクラス

                                        • -

サンプルも乗ってますが、とりあえずは動かす所を目標に持って行ってみましょう。
以下のHOMEボタンを押したり、システムプロパティを持ってくるサンプルを動かしてみましょう。

import android.app.Activity;
import android.os.Bundle;

import com.android.uiautomator.core.UiDevice;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;


public class SampleUITest extends UiAutomatorTestCase {
void testSample(){
UiDevice d = getUiDevice();
d.pressHome();
Bundle status = new Bundle();
status.putString("msg", "This is a demo test and I just pressed HOME");
status.putString("product", getUiDevice().getProductName());
status.putInt("dp-width", d.getDisplayWidth());
status.putInt("dp-height", d.getDisplayHeight());
getAutomationSupport().sendStatus(Activity.RESULT_OK, status);
}
}


3.テストのビルド

android uitest-project コマンドを使うようですが、まだ機能していないようです?
また試して再度掲載します。

テストのビルドは、ant を利用して行います。

android uitest-project コマンドを利用すると、build.xml が生成されるので、
この build.xml を利用して、ビルドを実行します。

android uitest-project -n -p -t

Target ID は、android list コマンドで取得します。
api レベル16以上のターゲットを選んでください。

Jenkins を利用すると、以下の様な設定になります。

export PATH=/var/lib/jenkins/tools/android-sdk/tools:$PATH
export PATH=/var/lib/jenkins/tools/Ant/ant-1.8.3/bin:$PATH
android create uitest-project -n SampleUITest -p . -t 28
ant build

4.テストの実行

前回の通り、adb push を利用して転送し
コマンドから実行します。
引数が若干増えてます。


$ adb shell uiautomator runtest test.jar -e class SampleUITest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: class=SampleUITest
INSTRUMENTATION_STATUS: stream=
SampleUITest:
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: test=testSample
INSTRUMENTATION_STATUS_CODE: 1
INSTRUMENTATION_STATUS: dp-height=480
INSTRUMENTATION_STATUS: product=google_sdk
INSTRUMENTATION_STATUS: msg=This is a demo test and I just pressed HOME
INSTRUMENTATION_STATUS: dp-width=320
INSTRUMENTATION_STATUS_CODE: -1
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: class=SampleUITest
INSTRUMENTATION_STATUS: stream=.
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: test=testSample
INSTRUMENTATION_STATUS_CODE: 0
INSTRUMENTATION_STATUS: stream=
Test results for UiAutomatorTestRunner=.
Time: 1.665

OK (1 test)


INSTRUMENTATION_STATUS_CODE: -1

画面の高さなどを取得して、コマンドライン側に受け渡すことに成功しました。


@nowsprinting さんにさき越されてました。

http://nowsprinting.hatenablog.com/entry/2012/11/22/235609
http://nowsprinting.hatenablog.com/entry/2012/11/23/163729



                                                                                                  • -


上記の手順で行うのが正式な手順のようです。
この手順なら、Jenkins との連携も可能ですね。



と、言うわけで、あんまり進んでないですが、ToDo更新
・テストの詳細な書き方。
 # 別に難しい所は無さそうですが
・MonkeyRunner(Easy)との速度比較
・Jenkins