Groups
Sign in
Groups
Android-SDK-Japan
Conversations
About
Send feedback
Help
ListViewを持つアプリで、Espressoにおけるclickを使ったテストがうまくいかない
441 views
Skip to first unread message
Andropenguin S
unread,
Aug 2, 2015, 9:30:33 PM
8/2/15
Reply to author
Sign in to reply to author
Forward
Sign in to forward
Delete
You do not have permission to delete messages in this group
Copy link
Report message
Show original message
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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 PM
8/3/15
Reply to author
Sign in to reply to author
Forward
Sign in to forward
Delete
You do not have permission to delete messages in this group
Copy link
Report message
Show original message
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to android-...@googlegroups.com
長部です。
本問題、stackoverflowで質問をポストしましたので、そちらの方で助言を得て、解決を試みます。
Reply all
Reply to author
Forward
0 new messages