ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

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 を開くためのインテントが投げられることを確認するテストが含まれています。

テストクラスは次のものですので、テストコードの参考にしてください。