2012年12月アーカイブ

Android Advent Calendar 2012 12月12日(表)担当の adakoda です。

本エントリでは、Android SDK Tools Rev.21 でサポートされた新しい UI テストフレームワークである uiautomator を使用し、

Android アプリケーションの UI テストケースを作成、実行する方法について解説し、

サンプルテストコードとして 「Android 標準の電卓アプリ上で足し算の結果を確認する」 テストケースを作成します。

※本エントリの内容は、「Android SDK Tools, Revision 21(21.0.1 rc1)」  「Android SDK Platform, API 17 (Android 4.2)」を対象とした内容となっています

 

uiautomator ツール

◆ テストプロジェクトを作成する

Eclipse 上で新規に「Java Project」を作成し、JUnit3、uiautomator.jar、android.jar ライブラリを追加することで作成できます。

【手順】

1. Eclipse を起動し、[File] > [New] > [Java Project] をクリックする。

2. [Create a Java Project] 画面で、[Project name] に作成したいプロジェクト名を入力し、[Next] をクリック。

3. [Java Settings] 画面、[Libraries] タブで [Add Library...] をクリック、

    [JUnit] が選択された状態で [Next] をクリック、[JUnit3] が選択された状態で [Finish] をクリック。

4. 同 [Java Settings] 画面、[Libraries] タブで [Add External JARs...] をクリック、

    インストールした Android SDK ディレクトリの platforms\android-17 下にある android.jar、uiautomator.jar を選択。

5. [Finish] をクリックすると、作成完了。

 

◆ テストクラスを作成する

UiAutomatorTestCase クラスを継承したクラスを作成し、テストメソッドを作成します。

※UiAutomatorTestCase クラスは、junit.framework.TestCase を継承したクラス

※具体的なテストクラスは、後述するサンプルテストコードで解説します

 

◆ ant を使用してビルドする

作成したプロジェクトを ant を使用してビルドするには、android コマンドを使用し、ant ビルドに必要なファイルを作成し、ビルドします。

【手順】

1. コマンドプロンプト/ターミナル上で 「android create uitest-project -n <name> -t <target> -p <path>」を実行する。

  ※<name> には、プロジェクト名 を指定する

  ※<target> には、「android list target」で表示される対象 API の Target ID を指定する

  ※<path> には、対象プロジェクトのパス を指定する

  例) 「android create uitest-project -n UIAutomatorSample -t 20 -p .」

2. プロジェクト下に「build.xml」ファイルが生成されていることを確認し、同ディレクトリで「ant build」を実行する。

 

◆ ビルドしたファイルを使用してテストを実行する

ビルドしてできた jar ファイルを adb コマンドで Android 端末に転送し、uiautomator ツールを使用してテストを実行します。

【手順】

1. 「adb push <ビルドして生成されたjarファイル> <転送先ディレクトリ>」を実行し、jar ファイルを Android 端末に転送します。

  例) 「adb push .\bin\UIAutomatorSample.jar /data/local/tmp」

2. 「adb shell uiautomator runtest <ビルドして生成されたjarファイル> -c <テストクラス>」を実行し、テストを実行する。

  例) 「adb shell uiautomator runtest UIAutomatorSample.jar  -c com.adakoda.android.uiautomatorsample.CalculatorTest」

 

◆ サンプルテストケース

ここでは、Android 標準の電卓アプリ上で足し算の結果を確認するテストケースを作成します。

テストのシナリオは、以下のとおりです。

【テストのシナリオ】

1. ホームボタンを押してアプリケーションランチャーを表示する。

2. アプリケーションランチャーから電卓アプリを起動する。

3. 電卓アプリの消去ボタンを長押しして、結果をクリアする。

4. 電卓アプリで「 1 」「 + 」「 2 」「 = 」ボタンをクリックし、結果が「 3 」であることを確認する。

 

◆ サンプルテストコード

package com.adakoda.android.uiautomatorsample;

import android.widget.TextView;

import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiScrollable;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;

public class CalculatorTest extends UiAutomatorTestCase {

    public void testAddition() throws UiObjectNotFoundException {
        // 1. ホームボタンを押してアプリケーションランチャーを表示する。
        getUiDevice().pressHome();

        // 2. アプリケーションランチャーから電卓アプリを起動する。
        UiObject allAppsButton = new UiObject(new UiSelector().description("アプリ"));
        allAppsButton.clickAndWaitForNewWindow();
        UiObject appsTab = new UiObject(new UiSelector().text("アプリ"));
        appsTab.click();

        // スワイプしながらアイテムを検索できるUiScrollableインスタンスを作成
        UiScrollable appViews = new UiScrollable(new UiSelector().scrollable(true));
        // スワイプ時のスクロール方向を水平方向に設定
        appViews.setAsHorizontalList();

        // アプリランチャーの子ビューから以下の条件を満たすUIオブジェクトを取得
        // 「クラス名が"android.widget.TextView"」、かつ、「テキストが"電卓"」
        UiObject targetApp = appViews.getChildByText(
                new UiSelector().className(TextView.class.getName()),
                "電卓");
        // 見つかったUIオブジェクト(ここでは電卓アプリアイコン)をクリックする
        targetApp.clickAndWaitForNewWindow();

        // 指定したパッケージ名のアプリの存在を確認する
        UiObject appValidation = new UiObject(
                new UiSelector().packageName("com.android.calculator2"));
        assertTrue(appValidation.exists());

        // 3.電卓アプリの"削除"ボタンを長押しして、結果をクリアする。
        UiObject buttonClear = new UiObject(new UiSelector().text("削除"));
        buttonClear.longClick(); // 長押し

        // 4. 電卓アプリで「 1 」「 + 」「 2 」「 = 」ボタンをクリックし、結果が「 3 」であることを確認する。

        // "1"ボタンを押す
        UiObject button1 = new UiObject(new UiSelector().text("1"));
        button1.click();
        // "+"ボタンを押す
        UiObject buttonPlus = new UiObject(new UiSelector().text("+"));
        buttonPlus.click();
        // "2"ボタンを押す
        UiObject button2 = new UiObject(new UiSelector().text("2"));
        button2.click();
        // "="ボタンを押す
        UiObject buttonEqual = new UiObject(new UiSelector().text("="));
        buttonEqual.click();

        // エディットテキストの値を取得する
        UiObject editText = new UiObject(new UiSelector().className("android.widget.EditText"));
        String textEditText = editText.getText();

        // 結果を確認する
        assertEquals(String.valueOf("3"), textEditText);
    }

}

 

◆ テスト実行結果(画面遷移)

上記テストコードを実行すると、以下の画面が自動的に遷移します。

home.png

0. テストを実行する前のホーム画面。

 

app1.png

1. ホームボタンを押し、アプリケーションランチャーが起動した画面。

 

app2.png

2. 自動的に水平スワイプが実行され、"電卓"というテキストのビューを探している画面。

 

calc1.png

3. 電卓アプリを起動し、削除ボタンを長押ししている画面。

 

calc2.pngcalc3.png

4. 「1」「+」「2」「=」ボタンを押して、「3」という結果となっていることを確認している画面。

 

uiautomatorviewer ツール

◆ UI コンポーネントのスキャンと解析を行う

uiautomator では、UiSelector クラスを使用して操作対象の UI を特定するのですが、

このための UI 解析ツールとして、uiautomatorviewer ツールが提供されています。

ツールを起動し、画面キャプチャ用のアイコン(左から2番目)を押すと、解析結果が表示され、

任意のビューの情報を表示させることができます。

 ※Windows 版は、Rev21.の bat ファイルに不具合があるため、21.0.1 rc1 でないと正常に動作しません

uiautomatorviewer.png

 

おわりに

uiautomator テストフレームワークは、まだまだ開発中のツールと思われるため、

本エントリで紹介した内容は、将来変更される可能性があります。

特に、ant ビルドの部分は、uibuild.xml ファイル内に <!-- todo: fix this --> と書かれているとおり、

ant test コマンドなどでもっと簡単にテストを実行できるようになると思われます^^;

 

◆ 参考リソース

 

◆ あわせて読みたい(Android Advent Calendar 2012 のテスト関連のエントリ)

1

2016年8月

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

最近のブログ記事