山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

Android UI Automatorを試してみました

AndroidのUI AutomatorGoogleが提供する自動テストツールです。Androidのテストは単体レベルはJUnit、単一ActivityのテストはEspresso2もしくはRobolectric、そして一連の画面遷移を通しでテストするのはUI Automatorが向いています。webでのSeleniumに相当します。アプリ版SeleniumというとAppiumがあります。Appiumも中でUI Automatorを利用しています。Appiumはwebやiphoneアプリと同じように書ける、いろんな言語で書けるというメリットもある一方UI Automatorの上にもう1つシステムが乗っかっている形になるのでうまく動かない場合大変です。

UI Automatorもどんどん仕組みが変わっている一方情報が少ない状態です。検索するとeclipse、JUnit3の記事がいろいろ見つかりますが今はAndroid StudioでJUnit4ベースで実装できます。Gradleで簡単に組み込めるようになっています。

情報源としてはGoogle本家のページが一番いいと思いました。
Testing UI for Multiple Apps | Android Developers
右の方のリンクのAPI ReferenceとCode Samplesも見るとよいと思います。

簡単に使い方を紹介します。
Android Studioのバージョンは1.3.1です。

Android Studioでの組み込み方ですがbuild.gradle(Module: app)の、dependenciesに2行追加します。

    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
    androidTestCompile 'org.hamcrest:hamcrest-integration:1.3'

minSdkVersionは18以上にしないといけません。

javaソースのテストのディレクトリのほうにテストクラスを作ります。普通のJUnit4ベースのテストクラスで大丈夫です。

@RunWith(AndroidJUnit4.class)
public class MyQuizUITest {

@Beforeのメソッドでアプリを立ち上げます。まずデバイスを取得します。

        device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

以後このdeviceに対していろいろ操作していきます。初期化部分はサンプルコードまねしただけで説明できるほど理解していないので上記のサンプルを御覧ください。多分どんなアプリでも同じようなコードになると思われます。

アプリを立ち上げたらボタンなどを検索してクリックしたりラベルを検索してテキストをチェックしていきます。

device.findObject(By.text("A0")).click();

Byで検索する方法とUiSelectorを使って検索する方法があるようです。それぞれ同じようなこともできますが若干違いもあります。詳しくはAPIドキュメントを見て実際にいろいろお試しください。

このようにとりあえず使うところまではだいぶ整備されていて思ったより簡単でした。

テキストを書き換えたりするところは少しウェイトを入れないと認識できない場合もありました。

また実機だとListViewの取得に10回中9回失敗するなどの現象もありました。エミュレータだと大丈夫でした。