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。
- 空の
EditText
にUiObject2.setText(String)
を使って文字列を入力しようとすると、NullPointerException
が発生する。 (Issue 201469) - 文字列設定済みの
EditText
にUiObject2.setText(String)
を使って、別の文字列に置き換えようとすると、元の文字が一部残ってしまうことがある。 (Issue 201473) - フォーカスの当たっていない空の
EditText
に、UiObject.setText(String)
を使って文字を入力しようとすると、フォーカスが移動しないまま文字を入力しようとしてしまう。 (Issue 201474)
これらを踏まえると、Lollipop未満でUI Automator2を使いたい場合は、以下の方針でテストを書くことで何とかなります。
UiObject2
は使わない。これで1つめと2つめのバグは回避できる。EditText
に文字列を入力するときは、目的のEditText
にフォーカスが当たっていないときは、文字入力前に明示的にタップしてフォーカスを移動させてから、文字入力する。EditText
に非ASCII文字を入力したいときは、拙作のUiautomator Unicode Input Helperを使う。
さいごに
DroidKaigi 2016の運営にかかわったスタッフの皆さんのお陰で、このような発表の機会を持つことができ、とても幸せでした。 開催までの準備には大変な苦労があったのだと思います。本当にありがとうございました。
また、発表を聴いて下さった皆様、直接声を掛けて下さった皆様、どうもありがとうございました。 ご意見、ご感想、ご質問などありましたら@sumio_tymまでコメントいただけると幸いです。
*1:講演が終わって心に余裕ができたので、一気にバグ報告しました。本当は貯め込まずにすぐにバグ報告すべきなんですが、ごめんなさい。