espresso onView性能不一致

时间:2016-02-17 15:20:55

标签: android junit4 android-testing android-espresso

我正在使用Junit4和Espresso进行测试。我正面临一个与espresso测试相关的奇怪问题 - 当我调用onView时,有时候所有内容都按照预期执行,但有时我的测试会冻结,60秒后我会得到类似这样的东西" android.support.test.espresso。 AppNotIdleException:在60 SECONDS上循环63次迭代。以下空闲条件失败ASYNC_TASKS_HAVE_IDLED" 例如:

    onView(withId(R.id.zone_button_continue)).perform(click());
    onView(withId(R.id.loginButton)).check(matches(isDisplayed()));
    onView(withId(R.id.number)).check(matches(isDisplayed()));
    onView(withId(R.id.password)).check(matches(isDisplayed()));
    onView(withId(R.id.number)).perform(typeText(phoneNumber));
    onView(withId(R.id.password)).perform(typeText(password));
    onView(withId(R.id.loginButton)).perform(click());
除了最后一行之外,所有内容都得到了正确的执行 - 由于某种原因,它无法找到loginButton,但它有100%的百分比。我能做到

activity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            activity.findViewById(R.id.loginButton).performClick();
             }
    });

这是有效的。在我的大多数活动中我都遇到过类似的问题 - 有时onView有时候不工作。

什么可能导致这种不一致?我一直在与这个问题作斗争,这让我的测试非常令人沮丧和困难。我的结论到目前为止我的gradle依赖项出了问题,或者我的应用程序中存在某种阻止espresso正常工作的错误。但奇怪的是,在上面的例子中,onView的所有内容都在工作,除了最后一行,一切都发生在一个活动中,这让我怀疑这个bug是在我的应用程序中。 以下是我的gradle依赖项:

compile files('src/main/libs/guice-3.0-no_aop.jar')
compile files('src/main/libs/javax.inject-1.jar')
compile files('src/main/libs/roboguice-2.0.jar')
compile files('src/main/libs/junit-4.11.jar')
compile files('src/main/libs/hamcrest-core-1.3.jar')
compile files('src/main/libs/GeoLib.jar')
compile files('src/main/libs/GeoPolygons.jar')
compile files('src/main/libs/universal-image-loader-1.9.4.jar')
compile files('src/main/libs/javax.annotation-3.2-b06-sources.jar')
compile ('uk.co.chrisjenx:calligraphy:2.1.0'){
    exclude group:'com.android.support'
}
compile 'com.squareup:otto:1.3.5'
compile ('com.google.android.gms:play-services:6.5.87'){
    exclude group:'com.android.support'
}
compile 'com.android.support:support-annotations:22.2.1'
compile ('com.android.support:appcompat-v7:22.2.0'){
    exclude group:'com.android.support'
}
compile ('com.android.support:support-v4:22.2.0'){
    exclude group:'com.android.support', module:'support-annotations'
}
compile ('com.android.support:palette-v7:22.2.0'){
    exclude group:'com.android.support'
}
compile 'com.google.code.findbugs:jsr305:2.0.1'

compile 'com.nineoldandroids:library:2.4.0'
compile 'pl.charmas.android:android-reactive-location:0.4@aar'
compile 'io.reactivex:rxjava:1.0.3'
compile files('src/main/libs/FlurryAnalytics-6.1.0.jar')
compile 'com.github.castorflex.smoothprogressbar:library:1.1.0'
//    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
androidTestCompile('com.android.support.test:runner:0.4.1') {
    exclude group: 'com.android.support', module: 'support-annotations'
}
// Set this dependency to use JUnit 4 rules
androidTestCompile('com.android.support.test:rules:0.4.1') {
    exclude group: 'com.android.support', module: 'support-annotations'
}
// Set this dependency to build and run Espresso tests
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.1') {
    exclude group: 'com.android.support', module: 'support-annotations'
}

androidTestCompile('com.android.support.test.espresso:espresso-intents:2.2.1') {
    exclude group: 'com.android.support', module: 'support-annotations'
}
androidTestCompile('com.android.support.test.espresso:espresso-web:2.2.1') {
    // PackagingOptions modified to make this work
    exclude group: 'com.android.support', module: 'support-annotations'
}
testCompile 'junit:junit:4.11'
testCompile ('org.mockito:mockito-core:1.9.5'){
    exclude group: 'org.hamcrest'
}
compile 'org.mod4j.org.apache.commons:lang:2.1.0'

请帮助我解决这个问题,我完全没有想法并坚持下去。

2 个答案:

答案 0 :(得分:10)

最简单的方法来了解为什么你得到AppNotIdleException消息"以下空闲条件失败ASYNC_TASKS_HAVE_IDLED",是:

  • 在Android Studio的调试模式下运行测试
  • 等到测试挂起
  • 在(默认)60秒过后,暂停测试
  • 查看"主题"列出并查看名为" AsyncTask#1"的线程等等。展开处于RUNNING状态的那个。在那里你看到代码的哪一部分让应用程序忙碌

这是我的案例的结果,所以我不得不为我的测试禁用Facebook SDK以使它们再次稳定:

Threads view while debugging

答案 1 :(得分:1)

有同样的问题,也是facebook库的错误。 切换到不同的模拟设备,一切正常!