Android Espresso中SystemClock.sleep的替代方案

时间:2017-04-24 14:10:16

标签: android android-espresso android-instrumentation

我正在为我的应用编写测试用例,但是遇到了一些小问题。我的许多测试用例中都有SystemClock.Sleep个调用,以便视图加载所有数据并将其显示在屏幕上。然而,这样做的睡眠次数越来越多,导致这些测试的时间更长。

以下是其中一项测试的示例

@Test
public void testSearch() {

    ExtensionForExpresso.signUp();

    SystemClock.sleep(17000);

    onView(withId(R.id.menu_offer_search)).check(matches(isDisplayed())).perform(click());

    SystemClock.sleep(5000);

    onView(withId(R.id.menu_search)).check(matches(isDisplayed())).perform(typeText("Pizza"));

    SystemClock.sleep(17000);

    onView(withId(R.id.searchSectionSeeAllButton)).check(matches(isDisplayed())).perform(click());

    SystemClock.sleep(15000);

    onView(withId(R.id.searchResultsRecyclerView)).check(matches(isDisplayed())).perform(RecyclerViewActions.actionOnItemAtPosition(1, click()));
}

是否存在等待视图出现的睡眠替代方案?或者我是否可以添加任何方法或功能来减少SystemClock.sleep来电的数量?

2 个答案:

答案 0 :(得分:1)

首先,尝试使用adb shell在您的设备/模拟器上停用动画,或在Android项目中实施Espresso空闲资源:http://matgom.com/tutorial/2016/02/21/IdlingResource.html

答案 1 :(得分:0)

我建议您首先实现IdlingResource并禁用系统动画。禁用系统动画的最简单方法是this

无需使用SystemClock.sleep()方法。相反,您可以实现这样的自定义睡眠方法:

public void waitFor(int seconds) {
        seconds = seconds < 0 ? 0 : seconds;
            while (--seconds >= 0) {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                     e.printStackTrace();
                }
            }
}

然后你可以在你的测试中调用它:waitFor(2); // 2 second wait