Espressoテストフレームワークを使用してみて、簡単なテストを作成しました。
そこには特別なことは何もありません。このコードだけです。
onView(withId(R.id.login_button_stub)).perform(click());
テストはNexus5デバイスとGenymotionでAndroid 5.0で正常に実行されますが、Android Emulator 4.x、5.0、Genymotion 2.3、4.xおよびLG G2 with Android 4.x.
これらすべてのデバイス/エミュレーター/シミュレーターで、ボタンがクリックされ、そのアクションが実行されます(私の場合は別の画面に移動します)。問題は、一部のデバイスではperform
でブロックされることです。これは60秒後にNice例外で終了します:
Android.support.test.espresso.PerformException: Error performing 'single click' on view 'with id: com.vielengames.mock:id/login_button_stub'.
...
Caused by: Android.support.test.espresso.AppNotIdleException: Looped for 3544 iterations over 60 SECONDS. The following Idle Conditions failed .
...
どの条件が失敗したかについての情報がないことに注意してください。 Espressoのソースコードを見ると、問題のコンマ区切りのリストがあるはずです。
完全なコードは次のとおりです: TestCase.Java 。
および完全なスタックトレース:
I/TestRunner﹕ Android.support.test.espresso.PerformException: Error performing 'single click' on view 'with id: com.vielengames.mock:id/login_button_stub'.
at Android.support.test.espresso.PerformException$Builder.build(PerformException.Java:83)
at Android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.Java:70)
at Android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.Java:53)
at Android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.Java:185)
at Android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.Java:115)
at Android.support.test.espresso.ViewInteraction.perform(ViewInteraction.Java:87)
at com.vielengames.ui.NotLoggedOnTestCase.testLoggedOnAfterLoginClick(NotLoggedOnTestCase.Java:19)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:515)
at Android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.Java:214)
at Android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.Java:199)
at Android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.Java:192)
at junit.framework.TestCase.runBare(TestCase.Java:134)
at junit.framework.TestResult$1.protect(TestResult.Java:115)
at junit.framework.TestResult.runProtected(TestResult.Java:133)
at Android.support.test.internal.runner.junit3.DelegatingTestResult.runProtected(DelegatingTestResult.Java:90)
at junit.framework.TestResult.run(TestResult.Java:118)
at Android.support.test.internal.runner.junit3.AndroidTestResult.run(AndroidTestResult.Java:49)
at junit.framework.TestCase.run(TestCase.Java:124)
at Android.support.test.internal.runner.junit3.NonLeakyTestSuite$NonLeakyTest.run(NonLeakyTestSuite.Java:63)
at junit.framework.TestSuite.runTest(TestSuite.Java:243)
at junit.framework.TestSuite.run(TestSuite.Java:238)
at Android.support.test.internal.runner.junit3.DelegatingTestSuite.run(DelegatingTestSuite.Java:103)
at Android.support.test.internal.runner.junit3.AndroidTestSuite.run(AndroidTestSuite.Java:63)
at Android.support.test.internal.runner.junit3.JUnit38ClassRunner.run(JUnit38ClassRunner.Java:90)
at org.junit.runners.Suite.runChild(Suite.Java:128)
at org.junit.runners.Suite.runChild(Suite.Java:24)
at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.Java:300)
at org.junit.runner.JUnitCore.run(JUnitCore.Java:157)
at org.junit.runner.JUnitCore.run(JUnitCore.Java:136)
at Android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.Java:270)
at Android.app.Instrumentation$InstrumentationThread.run(Instrumentation.Java:1701)
Caused by: Android.support.test.espresso.AppNotIdleException: Looped for 3544 iterations over 60 SECONDS. The following Idle Conditions failed .
at Android.support.test.espresso.IdlingPolicy.handleTimeout(IdlingPolicy.Java:61)
at Android.support.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.Java:471)
at Android.support.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.Java:402)
at Android.support.test.espresso.base.UiControllerImpl.injectMotionEvent(UiControllerImpl.Java:226)
at Android.support.test.espresso.action.MotionEvents.sendUp(MotionEvents.Java:135)
at Android.support.test.espresso.action.MotionEvents.sendUp(MotionEvents.Java:118)
at Android.support.test.espresso.action.Tap.sendSingleTap(Tap.Java:135)
at Android.support.test.espresso.action.Tap.access$100(Tap.Java:35)
at Android.support.test.espresso.action.Tap$1.sendTap(Tap.Java:40)
at Android.support.test.espresso.action.GeneralClickAction.perform(GeneralClickAction.Java:98)
at Android.support.test.espresso.ViewInteraction$1.run(ViewInteraction
これは私のアプリコードのバグで、SwipeRefreshLayout
が無期限にアニメーション化されていました。 このコンポーネントのバグ のため、更新状態も表示されませんでした。