sumioの技術メモ

Androidについての記事が多くなると思います。

DroidKaigi 2016で、UI Automator2について講演しました #DroidKaigi

2016/2/18(水)-19(木)に開催された、DroidKaigi 2016で「生まれ変わったUI Automatorを使いこなす」というタイトルで講演しました。以下が講演資料です。

UI Automatorが新しくなってから1年弱、時間を見つけては色々なことを試してみました。 その結果、大体の動きを把握することができましたが、実装ソースコードを読まないとAPIの振る舞いが分からないことが多く、把握するまでに沢山の時間が必要でした。

その知見を少しでも皆さんと共有できればと思い、DroidKaigi 2016に応募したところ、採択され、お話しする機会をいただくことができました。

今回の講演にあたって、自分の中で決めていた目標は以下の2点でした。

  • UI Automator2の使い方についてのまとまった情報をお届けする
  • 「とっつきにくい」と思われがちなUI Automator2に対して「使ってみようかな」と思ってもらえるようにする

そこで、UI Automator2の全体像やハマリポイントを説明しつつ、後者を達成するために、以下のようなストーリーでお話しさせていただきました。

  • 比較的使われているEspressoと併用できることをアピールする
  • イメージしやすく「ちょっと試しにやってみようかな」と思ってもらえるユースケースをいくつか提示する

講演についてのTweetや、直接コメントして下さった内容からの希望的推測ではありますが、結果としては、自分の思いは伝わったのではないかと思っています!

このエントリーでは、時間の関係で話すことのできなかった点をいくつか補足したいと思います。

minSdkVersionについての注意

テスト対象アプリのminSdkVersionが18未満の場合、UI Automator2のminSdkVersionが18であるため、そのままだとビルドすることができません。 それを回避するには、src/androidTest/AndroidManifest.xmlを、以下の内容で新規に作成してください。

<?xml version="1.0" encoding="utf-8"?>
<manifest
    package="(テストコードのパッケージ名)"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-sdk
        android:minSdkVersion="18"
        tools:overrideLibrary="android.support.test.uiautomator.v18"
        />
</manifest>

Lollipop未満でテストを実行するときの注意

講演では「不安定」としかお伝えしませんでしたが、具体的には、以下のバグがあります*1

  • 空のEditTextUiObject2.setText(String)を使って文字列を入力しようとすると、NullPointerExceptionが発生する。 (Issue 201469)
  • 文字列設定済みのEditTextUiObject2.setText(String)を使って、別の文字列に置き換えようとすると、元の文字が一部残ってしまうことがある。 (Issue 201473)
  • フォーカスの当たっていない空のEditTextに、UiObject.setText(String)を使って文字を入力しようとすると、フォーカスが移動しないまま文字を入力しようとしてしまう。 (Issue 201474)

これらを踏まえると、Lollipop未満でUI Automator2を使いたい場合は、以下の方針でテストを書くことで何とかなります。

さいごに

DroidKaigi 2016の運営にかかわったスタッフの皆さんのお陰で、このような発表の機会を持つことができ、とても幸せでした。 開催までの準備には大変な苦労があったのだと思います。本当にありがとうございました。

また、発表を聴いて下さった皆様、直接声を掛けて下さった皆様、どうもありがとうございました。 ご意見、ご感想、ご質問などありましたら@sumio_tymまでコメントいただけると幸いです。

*1:講演が終わって心に余裕ができたので、一気にバグ報告しました。本当は貯め込まずにすぐにバグ報告すべきなんですが、ごめんなさい。