android.support.test.espresso.PerformException:在视图上执行'load adapter data'时出错



我正在使用Espresso来测试当我搜索一个项目时出现的列表视图(如自动完成)。直到用户在SearchView中输入了一些内容,列表视图才会出现。例如,只有当用户在SearchView

中输入内容时,我才将ListView设置为View.VISIBLE

当我尝试在列表视图中单击文本时,我得到了这个错误。android.support.test.espresso.PerformException: Error performing 'load adapter data' on view 'with id:'。使用onData不能工作。

添加一个人为的延迟工作,但我不确定这是否是一个不好的做法,因为它似乎违背了onData等方法的目的。

我试过了:

  • 我试着看看Espresso测试记录器做什么,但是当我使用测试记录器的代码时,我得到上面的错误。我相信这是因为录音机引入了一些延迟。

  • 我阅读了这些StackOverflow问题,但他们没有解决我的问题:

    • 浓缩咖啡。执行'load adapter data'
    • 错误
    • Espresso onData执行'load adapter data'在

我的代码

这段代码可以工作,但是我不希望引入人为的延迟。

public pickSuggestion(int index){
    /** artificial delay to allow list to appear. 
    This works but I shouldn't have to do this right? **/
    SystemClock.sleep(1000);
    onData(anything())
        .inAdapterView(withId(R.id.list))
        .atPosition(index)
        .onChildView(withId(R.id.mTextView))
        .perform(click());
}

添加一个人工延迟工作,但我不确定这是不好的实践,因为它似乎挫败了方法的目的,如数据等。

您的error具有Espresso限制。这个框架需要在UI线程上运行,它"等待"直到它空闲。它不等待加载适配器数据,而是等待获取空闲资源

检查:http://dev.jimdo.com/2014/05/09/wait-for-it-a-deep-dive-into-espresso-s-idling-resources/

IdlingResource Reference: https://developer.android.com/reference/android/support/test/espresso/IdlingResource.html

IdlingResource Documentation: https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html

CountingIdlingResource: https://developer.android.com/reference/android/support/test/espresso/idling/CountingIdlingResource.html

SystemClock.sleep(1000)Thread.sleep(1000)这样的代码是一个不好的做法,因为更好的设备不需要这么多的时间,而旧的设备需要更多的时间,所以你的代码可能不稳定,而不是快速和灵活。

解决方案是创建自己的Espresso IdlingResource来告诉Espresso何时可以执行测试而不会丢失数据和时间。

得到相同的错误信息在视图上执行'加载适配器数据'错误,这些帖子的答案都不适合我。

测试RecyclerView是否有Espresso数据
执行'加载适配器数据'在
浓缩咖啡。执行'load adapter data'

我最终在Android Studio中使用了Espresso UI测试记录器。从顶部下拉菜单转到运行,然后单击记录浓缩咖啡测试。它会要求你选择要运行的设备,一旦应用启动,手动执行你想要执行的ui测试,并在需要时添加断言。完成后点击OK。它将生成一个UI测试文件。

单击RecyclerView上的项所生成的代码如下所示。这里的重头戏是Matcher方法childAtPosition()在测试开始时,它会休眠10秒以确保所有内容都已加载,通常不需要10秒,您可以将其减少到大概2秒。另一种选择是像@piotrek1543所建议的那样使用Espresso IdlingResource,但是这需要在生产代码中添加干预(混合特定于测试的代码)来适应测试。
@LargeTest
@RunWith(AndroidJUnit4.class)
public class MainActivityTest {
    @Rule
    public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);
    @Test
    public void mainActivityTest() {
        // Added a sleep statement to match the app's execution delay.
        // The recommended way to handle such scenarios is to use Espresso idling resources:
        // https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        ViewInteraction recyclerView = onView(
                allOf(withId(R.id.recycler_view_list),
                        childAtPosition(
                                withClassName(is("android.support.constraint.ConstraintLayout")),
                                0)));
        recyclerView.perform(actionOnItemAtPosition(0, click()));
    }
    private static Matcher<View> childAtPosition(
            final Matcher<View> parentMatcher, final int position) {
        return new TypeSafeMatcher<View>() {
            @Override
            public void describeTo(Description description) {
                description.appendText("Child at position " + position + " in parent ");
                parentMatcher.describeTo(description);
            }
            @Override
            public boolean matchesSafely(View view) {
                ViewParent parent = view.getParent();
                return parent instanceof ViewGroup && parentMatcher.matches(parent)
                        && view.equals(((ViewGroup) parent).getChildAt(position));
            }
        };
    }
}
注意:Espresso UI测试记录器生成的代码也不是完美的,它在大多数情况下工作,但不是100%

相关内容

  • 没有找到相关文章

最新更新