Espresso を使って PreferenceActivity の自動 UI テストを行う (Android アプリ開発)
表題どおり、Espresso を使って PreferenceActivity
の自動 UI テストを行う方法について簡単に説明します。
この記事内容は古くなっています
このエントリを書いていた頃は Espresso 1.1 でしたが、現在では Espresso 2.0 がリリースされています。 Espresso 自体の使い方はほとんど変わっていませんが、準備の方法が大きく違っています。 Espresso 2.0 については下記エントリを参照してください。
Espresso
Espresso とは
Espresso とは、android-test-kit プロジェクトの一部で、Android アプリの UI テストを行うためのライブラリです。
軽く使ってみた感じですが、結構使いやすい API になっていますし、使い始めるのはそれほど大変ではないですので、単一の activity に対する UI の自動テストなどではどんどん使っていくと良さそうです。
Espresso の準備や使い方
基本的にはプロジェクトサイトのドキュメントを見るといいでしょう。
日本語のブログ記事では、yanzm さんの記事がわかりやすいと思います。 (yanzm さんのブログでは下記記事以外にも Espresso 関係の記事がいくつかあります。)
GoogleInstrumentationTestRunner
について
上のページを見ながら Espresso の準備をする際、GoogleInstrumentationTestRunner
を使うようにする設定を書くと思います。
GoogleInstrumentationTestRunner
というのは、Espresso が必要とするテストランナーです。 android-test-kit プロジェクトに含まれています。 テスト開始までにアプリケーションの onCreate
が終わっていることを保証したり、Instrumentation で作られた Activity の onFinish
メソッドが Instrumentation の終了時までに呼ばれることを確実にしたりしてくれます。 詳細は次のページ。
PreferenceActivity の自動 UI テスト
『PreferenceActivity
上の設定項目をタップ (クリック) して、挙動を検査する』 という簡単なテストの方法について説明します。
PreferenceActivity 上に表示されている項目の選択
PreferenceActivity
上に表示されている項目のリストは ListView
で実装されています。 Espresso では、ListView
上に表示されている項目を選択するためのメソッドとして、Espresso.onData
メソッドが提供されています。
Espresso.onData
メソッドは、ListView
の各項目に結び付けられたデータ (Adapter
で提供されるデータ) から与えられた条件にマッチするものを見つけ、対応する view を見つけるというようなものです。 詳細は次を見てください。
そして、PreferenceActivity
のリストの各項目にマッチするかどうかを調べるための Matcher として、PrefernceMatchers
クラスが Espresso には含まれています。
具体的には、次のようなコードで特定のキーを持つ項目をクリックさせることができます。
// 必要な `import` 文 import com.google.android.apps.common.testing.ui.espresso.matcher.PreferenceMatchers; import org.hamcrest.Matchers; import static com.google.android.apps.common.testing.ui.espresso.Espresso.onData; import static com.google.android.apps.common.testing.ui.espresso.action.ViewActions.click; // "setting-name" というキーの設定項目を選択し、クリックする。 onData(Matchers.<Object>allOf(PreferenceMatchers.withKey("setting-name"))).perform(click()); // 本来は画面上に項目が表示されていなくても自動でスクロールしてくれるはずだが、 // 必ずしもそうならないことがある。 (詳細は後述)
次の記事も参考になります。
項目の選択についてのバッドノウハウ (スクロールについて)
上のサンプルコードの中のコメントにも書いたように、onData
を使って、もともと画面上に表示されていない項目を選択した場合は、Espresso が自動的に項目を画面上に表示してくれます。 しかし、PreferenceActivity
のリストではうまく動かない場合がありました。
- API level 8 でうまく動かないことを確認。
- API level 19 では、
targetSdkVersion
を 19 にしていれば動くが、targetSdkVersion
を指定しなかった場合は動かないことを確認。
回避策として、一度リストのドラッグを行えば良いようです。 (ドラッグにより項目が見える必要はなくて、単にドラッグすればよいようである。) 自動テスト時のリストのドラッグには TouchUtils
を使うのが便利だと思います。
サンプルプロジェクト
Espresso を使って PreferenceActivity
の自動 UI テストを行うサンプルプロジェクトを GitHub で公開しています。
このサンプルプロジェクトには、単に設定画面のみを持つアプリ (テスト対象) と、その設定画面の中の特定の項目をタップして、HTTP スキーマの URL を開くためのインテントが投げられることを確認するテストが含まれています。
テストクラスは次のものですので、テストコードの参考にしてください。