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のAPIリファレンスを参照してください。
「UiAutomatorTestCase」クラスに「getUiDevice()」メソッドが定義されているため、テストクラス内であれば、いつでもこのインスタンスを取得できます。
「UiSelector」クラスは、テストスクリプトから操作(もしくは検証)する対象のUIコンポーネントを特定するための「検索条件」を表します。
具体的な使い方は「UIコンポーネントの特定」の章で説明します。
「UiObject」クラスは、テストスクリプトから操作(もしくは検証)する対象のUIコンポーネントそのものを表します。
具体的な使い方は「UIコンポーネントの操作」の章で説明します。
操作対象のUIコンポーネントを特定するには、まずUiSelectorクラスのメソッドによって検索条件を組み立てます。ここでは代表的な検索条件を紹介するに留とどめますが、他にも多様な条件を指定できます。詳しくはUiSelectorのAPIリファレンスを参照してください。
目的のUIコンポーネントを特定するためのUiSelectorを構築できたら、それを基にUiObjectクラスのインスタンスを生成することで、検索条件に合うUIコンポーネントを操作できます。
// "OK"と表示されているUIコンポーネントをクリックする UiSelector criteria = new UiSelector().text("OK"); UiObject okButton = new UiObject(criteria); okButton.click();
UIコンポーネントの検索について、以下の点に注意してください。
このとき、条件に合うコンポーネントが見つからないとUiObjectNotFoundException例外が発生します。
ただ、具体的にどのメソッドで検索が実行されるのかはAPIリファレンスに明記されていないため、APIリファレンスを参照して、「Throws」欄にUiObjectNotFoundExceptionが明記されているものは、検索が行われるメソッドだと判断するのがいいでしょう。
単一の条件ではUIコンポーネントを特定できない場合、メソッドチェイン形式で複数条件を指定できます。例えば、以下のコードは「画面上に複数あるButtonのうち、ラベルが"OK"のもの」を表します。
UiSelector criteria = new UiSelector().className("android.widget.Button").text("OK");
これで、同一画面上に「ラベルが"Cancel"のButtonクラス」があったとしても、問題なく"OK"というラベルを持ったボタンを特定できます。
以下のように、同一画面に複数の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 © ITmedia, Inc. All Rights Reserved.