【发布时间】:2018-10-15 14:03:19
【问题描述】:
我是 Espresso 测试框架的新手。现在我有一个任务来测试一些适用于异步后端的应用程序。当第一个活动开始时,一些片段仅在加载后出现。这可能需要几秒钟,所以最简单的方法就是等待 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);
如何在不阻塞主线程的情况下延迟测试执行?
【问题讨论】:
-
您确定 Espresso 没有因为其他原因而冻结吗?例如,如果您忘记禁用设备/模拟器上的动画,就会发生这种情况。附带说明一下,硬编码等待似乎是一个非常脆弱的解决方案。为什么不让
isIdleNow检查数据是否真的已经加载? -
是的,动画被禁用。我知道等待一定时间的解决方案并不完美,但我不知道如何以另一种方式做到这一点。
标签: java android testing android-espresso qa