連載
» 2014年10月07日 18時00分 公開

スマホ向け無料システムテスト自動化ツール(2):Android SDK標準の何でもテストツールuiautomatorの基本的な使い方 (2/3)

[外山純生,テスト自動化研究会(STAR)/Androidテスト部]

uiautomatorの主なAPI

 uiautomatorで実行するテストクラスは、「UiAutomatorTestCase」のサブクラスとして定義します。「UiAutomatorTestCase」は「junit.framework.TestCase」を継承したクラスですので、テストメソッドは「test」で始まる名称を付けるなど、JUnit 3のルールに準じて書いていきます。

import com.android.uiautomator.testrunner.UiAutomatorTestCase;
public class CustomerDetailTest extends UiAutomatorTestCase {
    public void test新規顧客の追加() throws Exception {
        // ここにテストスクリプトを記述する
    }
}

 uiautomatorのAPIのうち、最低限押さえておきたいクラスは「UiDevice」「UiSelector」「UiObject」の3クラスです。それぞれのクラスの概要は以下の通りです。

UiDeviceクラス

 UiDeviceは、テストを実行するデバイスそのものや、その状態を表すクラスです。端末下部にある「ホーム」ボタンなどを操作するメソッドや、端末の向きを変更するメソッドなどが用意されています。

 詳しくはUiDeviceのAPIリファレンスを参照してください。

 「UiAutomatorTestCase」クラスに「getUiDevice()」メソッドが定義されているため、テストクラス内であれば、いつでもこのインスタンスを取得できます。

UiSelectorクラス

 「UiSelector」クラスは、テストスクリプトから操作(もしくは検証)する対象のUIコンポーネントを特定するための「検索条件」を表します。

 具体的な使い方は「UIコンポーネントの特定」の章で説明します。

UiObjectクラス

 「UiObject」クラスは、テストスクリプトから操作(もしくは検証)する対象のUIコンポーネントそのものを表します。

 具体的な使い方は「UIコンポーネントの操作」の章で説明します。

UIコンポーネントの特定

基本的な使い方

 操作対象のUIコンポーネントを特定するには、まずUiSelectorクラスのメソッドによって検索条件を組み立てます。ここでは代表的な検索条件を紹介するに留とどめますが、他にも多様な条件を指定できます。詳しくはUiSelectorのAPIリファレンスを参照してください。

  • className():UIコンポーネントのクラス名。そのUIコンポーネントのクラス名("android.widget.Button"など)を条件に指定
  • text():UIコンポーネントに表示されている文字列。text属性の値を条件に指定
  • description():UIコンポーネントのcontentDescription属性に設定されている文字列を条件に指定

 目的のUIコンポーネントを特定するためのUiSelectorを構築できたら、それを基にUiObjectクラスのインスタンスを生成することで、検索条件に合うUIコンポーネントを操作できます。

// "OK"と表示されているUIコンポーネントをクリックする
UiSelector criteria = new UiSelector().text("OK");
UiObject okButton = new UiObject(criteria);
okButton.click();

 UIコンポーネントの検索について、以下の点に注意してください。

  • UiSelectorで組み立てた条件に合うUIコンポーネントの検索は、UiObjectの操作・検証メソッドを呼び出すたびに行われる(上例ではokButton.click()のタイミング)
  • 条件に合うUIコンポーネントが複数存在する場合は「最初に見つかったもの」に対して操作・検証が実行される

 このとき、条件に合うコンポーネントが見つからないとUiObjectNotFoundException例外が発生します。

 ただ、具体的にどのメソッドで検索が実行されるのかはAPIリファレンスに明記されていないため、APIリファレンスを参照して、「Throws」欄にUiObjectNotFoundExceptionが明記されているものは、検索が行われるメソッドだと判断するのがいいでしょう。

複数条件での絞り込み

 単一の条件ではUIコンポーネントを特定できない場合、メソッドチェイン形式で複数条件を指定できます。例えば、以下のコードは「画面上に複数あるButtonのうち、ラベルが"OK"のもの」を表します。

UiSelector criteria = new UiSelector().className("android.widget.Button").text("OK");

 これで、同一画面上に「ラベルが"Cancel"のButtonクラス」があったとしても、問題なく"OK"というラベルを持ったボタンを特定できます。

ヒエラルキーを条件に指定するchildSelector()

 以下のように、同一画面に複数のOKボタンがあるレイアウトを考えます。

RelativeLayout
  ├LinearLayout
  │  ├OKボタン
  │  └Cancelボタン
  │
  ├OKボタン
  └Cancelボタン

 このようなケースでは、UIコンポーネントのヒエラルキーを条件に指定できます。

 childSelector()は、「{親の検索条件}.childSelector({子の検索条件})」と書くことで、UIコンポーネントのヒエラルキーを条件に指定できます。

 例えば、以下のコードであれば「LinearLayout配下のOKボタン(ラベルが"OK"のButtonクラス)」を正しく特定できます。間違って「RelativeLayout配下のOKボタン」が検索されることはありません。

// OKボタンを表す条件。これが「子の検索条件」になる
UiSelector childCriteria = new UiSelector().className("android.widget.Button").text("OK");
// 「LinearLayout配下のOKボタン」を表す条件
UiSelector criteria = new UiSelector().className("android.widget.LinearLayout").childSelector(childCriteria);

それでも絞り込めない場合

 以下のレイアウトのように、ヒエラルキーでもUIコンポーネントを特定できない場合は「instance()」を使います。

RelativeLayout
  ├LinearLayout
  │  ├OKボタン
  │  └Cancelボタン
  │
  └LinearLayout
      ├OKボタン
      └Cancelボタン

 instance()は、同一条件のコンポーネントが複数ある場合に「何番目のコンポーネントか」を指定できるメソッドです(0から数える)。例えば、以下のコードは、「最初(0番目)に現れたLinearLayout配下のOKボタン」を表します。

// OKボタンを表す条件。これが「子の検索条件」になる
UiSelector childCriteria = new UiSelector().className("android.widget.Button").text("OK");
// 「最初(0番目)に現れたLinearLayout配下のOKボタン」を表す条件
UiSelector criteria = new UiSelector().className("android.widget.LinearLayout").instance(0).childSelector(childCriteria);

 このように、UIコンポーネントを特定するための条件は、アプリの画面を見ただけでは書けないケースが多くあります。そのため、ソースやレイアウト定義を参照することなく画面上のコンポーネントの構成を確認できるツール(uiautomatorviewer)も用意されています。

 uiautomatorviewerの使い方は次回紹介します。

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。