ListViewを持つアプリで、Espressoにおけるclickを使ったテストがうまくいかない

440 views
Skip to first unread message

Andropenguin S

unread,
Aug 2, 2015, 9:30:33 PM8/2/15
to android-...@googlegroups.com
長部と申します。

ListViewを使ったアプリのUIのテストをEspressoを使って行っています。テストで、perform(click())すると、PerformExceptionが発生して、指定行のクリックが行われません。clickをlongClickに変えると、ロングタップの挙動をし、プロダクションコードのロングタップに応じた処理が確かに行われます。

プロダクションコードでは、リストの行のデータは、

Hoge0
Hoge1
Hoge2
...

となっていて、テストでは、リストの第1行をクリックします。テストコードで、クリックのテストは以下のようになっています。

    public void testScreenTransition() throws Throwable {
        // Creating dummy data
        cleanData();
        createTestData(200);
       
        ainActivity activity = getActivity();

//        registerPersonLoaderIdlingResource();

        assertFalse(activity.isFinishing());
        final ListView listView = (ListView)activity.findViewById(android.R.id.list);
        assertEquals(200, listView.getCount());
       
        onData(anything()).inAdapterView(withId(android.R.id.list)).atPosition(0)
                .check(ViewAssertions.matches(ViewMatchers.isDisplayed()));

        onData(anything()).inAdapterView(withId(android.R.id.list)).atPosition(0)
                .perform(click());

//        unRegisterPersonLoaderIdlingResource();
    }
   
 
 テストコード中で、checkをしている部分は、テストが通っているので、指定行が存在していると思います。しかし、perform(click())で、PerformExceptionが発生して、テストが通りません。
 
 当初、テストがクリックする前に、リストが表示されていなく、指定行が見つけられなく、テストが失敗していたと推測しました。データはデータベースに保存しているのですが、データ読み込みに時間がかかると思い、AsyncTaskLoaderを使い、また、Idling Resourceを使ってみました。AsyncTaskLoaderが走っているかを表す状態変数を、スレッドセーフなSingletonパターンクラスに持たせ、AsyncTaskLoaderの開始時、状態変数をtrueにして、終了時、状態変数をfalseにしました。そして、Idling Resourceを実装したクラスのisLoaderRunningメソッドで、状態変数に応じて、trueを返すか、falseを返すかをしました。しかし、Idling Resourceを使っても、テストで同じエラーが出ました。この試みをやった後、上述したcheckのテストをやったところ、それに関してはテストが通ったので、Espressoは、Idling Resourceを使わなくても非同期のUIの処理はある程度面倒を見てくれるのではないかと推定しました。
 
 それで、疑問なのですが、そもそも、
 
 onData(anything()).inAdapterView(withId(android.R.id.list)).atPosition(0)
                .perform(click());
               
において、APIの使用の仕方を間違っているのしようか。

なお、はじめ、VirtualBox仮想マシンのUbuntu上で、テストを行っていて、エミュレータのAPI Levelを失念したのですが、perform(click())のテストが半分くらいの頻度で通っていました。この半分くらいの頻度というのが不可解なのですが、非同期処理がからむから、スレッドセーフでないことをやっているからかと考えていました。しかし、ある日を境に、API Level 19のエミュレータでは、上記のコードで、行が200あると期待されているのに、テストでは0行で失敗するとか、API Level 21のエミュレータは起動しすらしなくなりました。logを見ると、GPUに関するエラーが出ていて、また、ググると、仮想マシンでエミュレータを動かすのは推奨されないとあったので、実PCでのテストに変更しました。実PCでのテストは上述の通りで、API Level 19では、リストに200行期待されるのに、0行しかないというテスト結果が出て、これも不可解です。

Andropenguin S

unread,
Aug 3, 2015, 10:54:54 PM8/3/15
to android-...@googlegroups.com
長部です。

本問題、stackoverflowで質問をポストしましたので、そちらの方で助言を得て、解決を試みます。

Reply all
Reply to author
Forward
0 new messages