Android SDK標準の何でもテストツールuiautomatorの基本的な使い方:スマホ向け無料システムテスト自動化ツール(2)(2/3 ページ)
本連載では、スマートフォン(Android/iOS)アプリ開発における、システムテストを自動化するツールを紹介しています。今回は他者の署名したアプリもテストできる、Android SDK標準の何でもテストツールuiautomatorの特徴や基本的な使い方について。
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 © ITmedia, Inc. All Rights Reserved.