java - 在不卡住主线程的情况下在 Espresso Android 中进行延迟测试

标签 java android testing android-espresso

我是 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/

相关文章:

java - 如何从静态上下文中获取资源内容?

javascript - 从文件执行 javascript 函数 Selenium WebDriver Java

android - 如何在 Android 应用程序中动态修改本地化值

testing - GUI 应该有自己的自动化测试吗?

java - 构建测试类?

java - 静态内部类编译结果

java - 如何通过 Maven2 pom.xml 获取 Hibernate + javax.persistence

android - 如何在 Android 中使用自定义权限?

android - Ionic 在最新检查期间无法捕获任务 ':app:preDebugBuild' 属性 'compileManifests' 的输入文件指纹

java - 测试 onActivityResult()