こんにちは、またくです。
Espressoという, Google が提供している Android のUIテスティングライブラリがあります。
Viewに何が表示されているのかということを確かめるためのメソッドが用意されているので,
これを JUnit やいい感じの Matcher と組み合わせてやるといいのかなと思い,
UIテストと聞くとびくっとしてしまう身体になりましたが, Android の方も気になっていたので, たしなみました。
事前準備
Android Studio (2.2.2) を使っています。
Espresso は Android Support Libraryとして組み込まれているため, これを Android SDK Manager の SDK Tools タブからダウンロードしておけば, jar をどこかに配置するといった作業は不要でした。

その後, コンパイル時にビルドしてもらえるように,
app/build.gradle
の dependency
の所に, 公式に沿って追記しました。
主な流れ
ViewMatchers
で要素を特定 (withId, withTextなど)
ViewActions
で必要なアクションを指定し実行 (上下左右のswipe, タップなど)
ViewAssertions
で確認
// 例
onView(withId(R.id.someButton)) // 要素の特定
.perform(click()) // アクション
.check(matches(withText("changed"))) // 確認(assertion)
matches() で期待される動作を確かめるのですが,
その動作として isDisplayed
や withText
など様々な ViewMatcher を引数として指定できます。
丁度よい Matcher がなければ作ることもできます。
要素を特定できれば, 普段使うようなアクションは用意されているので, それを用いてテストできそうです。
IDで要素を特定する
onView(withId(R.id.someButton))
...
要素が持っているテキストで識別する
テキストは単一のものである必要があります。
onView(withText(“Hello”))
…
ListView や GridView のX番目の要素を確認したい場合
onData(anything()).inAdapterView(withId(R.id.someGridView))
.atPosition(X)
…
ListView や GridView はセルを用いて, 要素を格子状に並べて表示できるViewです。
このセル(=子View)へリストを渡したい, 入れたい際にはAdapterというものを経由させるとできます。
ただ Adapter によって作られた子Viewには, IDは割り振られていないので, このX番目のセル(つまり子View)の内容をチェックしたいという場合には, onView は使えません(多分)。そのため, 上のように onData を用いてチェックします。
ただ何番目という条件を気にしないのであれば, その子Viewが持っている要素が単一のものなら, onView(withText("target"))
などで特定自体はできます。
テスト
当たり前ですが, テストをするには対象のアプリがないと始まらないので, 以下のようなものを用意しました。
シンプルですが機能はこんな感じです。
- 日曜始まりの1ヶ月分のカレンダーの表示
- ‘
←
’ が表示されているボタンを押すと先月へ移動 - ‘
→
’ が表示されているボタンを押すと次月へ移動 - 移動ボタンの真ん中に
YYYY/MM
で年月を表示
ただのカレンダーです。これをどう作るかに関しては, 少しスペースが足りないので, 後で書きます。
そしてテストは以下のように書きました。長いファイルを貼り付けるとエラーになるので, gist を埋め込んで表示しますね。いざ。
TextView の色のチェックをする際に, 既存のメソッドでいい感じのものがなかったので, withTextColor
という matcher をぴゃっと書いています。
おわりに
良いタイトルが思いつかなかったので, 悔しさでいっぱいです。
Adapterのところはいまいちつかめていないので, もう少し調べたいです。
そういえば, カレンダーの下があいていますね。
今回のボツタイトル
普通が好き を掘り下げると大体普通より上
回鍋肉のたれより万能な調味料ってあるの?