我是 Espresso 测试框架的新手。现在我有一个任务来测试一些与异步后端一起工作的应用程序。当第一个 Activity 开始时,一些 fragment 只有在加载后才会出现。这可能需要几秒钟,所以最简单的方法就是等待 5-7 秒。但是,使用 IdlingResource 会卡住主线程,因此在等待超时结束之前我的后端数据无法加载。
这就是我使用 IdlingResource 的方式:
public static class ElapsedTimeIdlingResource implements IdlingResource {
private final long startTime;
private final long waitingTime;
private ResourceCallback resourceCallback;
ElapsedTimeIdlingResource(long waitingTime) {
this.startTime = System.currentTimeMillis();
this.waitingTime = waitingTime;
}
@Override
public String getName() {
return ElapsedTimeIdlingResource.class.getName() + ":" + waitingTime;
}
@Override
public boolean isIdleNow() {
long elapsed = System.currentTimeMillis() - startTime;
boolean idle = (elapsed >= waitingTime);
if (idle) resourceCallback.onTransitionToIdle();
return idle;
}
@Override
public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
this.resourceCallback = resourceCallback;
}
}
我怎么调用它:
long waitingTime = 5000;
onView(withId(R.id.row_content)).check(matches(isDisplayed())).perform(click());
IdlingPolicies.setMasterPolicyTimeout(waitingTime * 2, TimeUnit.MILLISECONDS);
IdlingPolicies.setIdlingResourceTimeout(waitingTime * 2, TimeUnit.MILLISECONDS);
IdlingResource idlingResource = new ElapsedTimeIdlingResource(waitingTime);
IdlingRegistry.getInstance().register(idlingResource);
// .... do some tests
IdlingRegistry.getInstance().unregister(idlingResource);
如何在不阻塞主线程的情况下延迟测试执行?
最佳答案
所以我有一个闪屏 fragment ,它在延迟后处理我正在测试的 fragment 。 @Aarons 的回答很有效。
onView(isRoot()).perform(waitFor(5000))
Kotlin 等待():
fun waitFor(delay: Long): ViewAction? {
return object : ViewAction {
override fun getConstraints(): Matcher<View> = isRoot()
override fun getDescription(): String = "wait for $delay milliseconds"
override fun perform(uiController: UiController, v: View?) {
uiController.loopMainThreadForAtLeast(delay)
}
}
}
关于java - 在不卡住主线程的情况下在 Espresso Android 中进行延迟测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52818524/