Espresso 测试被后台线程阻塞。应用程序未空闲异常:“AppNotIdleException”。

Posted

技术标签:

【中文标题】Espresso 测试被后台线程阻塞。应用程序未空闲异常:“AppNotIdleException”。【英文标题】:Espresso test blocked with background thread. Application not idle Exception: "AppNotIdleException." 【发布时间】:2016-09-14 07:51:54 【问题描述】:

由于某些后台线程未空闲,我的 android espresso 单元测试被阻止。如何确定哪个线程阻止了我的应用程序执行?

        android.support.test.espresso.AppNotIdleException: Looped for 246 iterations over 60 SECONDS. The following Idle Conditions failed ASYNC_TASKS_HAVE_IDLED.
        at dalvik.system.VMStack.getThreadStackTrace(Native Method)
        at java.lang.Thread.getStackTrace(Thread.java:580)
        at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:92)
        at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:56)
        at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:184)
        at android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:115)
        at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:87)
        at android.support.test.espresso.Espresso.closeSoftKeyboard(Espresso.java:159)

【问题讨论】:

检查这个请***.com/a/56198539/4797289 【参考方案1】:

作为开始:

Espresso for Android 是完美且快速的测试自动化框架, 但它有一个重要的限制——你只能操作 在您的应用程序中的测试上下文中。

来自: http://qathread.blogspot.com/2015/05/espresso-uiautomator-perfect-tandem.html

表示Espresso执行任何动作都需要在app的主线程上操作。它检查 UI 线程何时为 idle(),如果不是,则等待 UI 线程再次空闲。

如果 UI Thread 没有空闲太久,它会产生Espressso IdlingResources 类似AppNotIdleException 的错误,这意味着:

表示应用程序即使在指定的持续时间后也没有空闲的异常。

要处理这个问题,你需要创建自己的IdlingResource 方法来表示Espresso,而UI 线程将是idle()

让我们更深入地看一下问题:

Espresso 引入了IdlingResource 的概念,这是一个简单的 接口:

表示正在测试的应用程序的资源 这可能导致在测试期间发生异步后台工作 执行

接口定义了三个方法:

getName():必须返回一个标识空闲资源的非空字符串。 isIdleNow():返回空闲资源当前的空闲状态。如果返回 true,则上的 onTransitionToIdle() 方法 注册的 ResourceCallback 必须之前被调用过。 registerIdleTransitionCallback(IdlingResource.ResourceCallback callback):通常这个方法用于存储对的引用 回调以通知它空闲状态的变化。

例如,一个空闲资源的实现等待一个 在 WebView 中完全加载的页面将如下所示:

public class WebViewIdlingResource extends WebChromeClient implements IdlingResource 

    private static final int FINISHED = 100;

    private WebView webView;
    private ResourceCallback callback;

    private WebViewIdlingResource(WebView webView) 
        this.webView = checkNotNull(webView,
                String.format("Trying to instantiate a \'%s\' with a null WebView", getName())));
        // Shall we save the original client? Atm it's not used though.
        this.webView.setWebChromeClient(this);
    

    @Override public void onProgressChanged(WebView view, int newProgress) 
        if (newProgress == FINISHED && view.getTitle() != null && callback != null) 
            callback.onTransitionToIdle();
        
    

    @Override public void onReceivedTitle(WebView view, String title) 
        if (webView.getProgress() == FINISHED && callback != null) 
            callback.onTransitionToIdle();
        
    

    @Override public String getName() 
        return "WebView idling resource";
    

    @Override public boolean isIdleNow() 
        // The webView hasn't been injected yet, so we're idling
        if (webView == null) return true;
        return webView.getProgress() == FINISHED && webView.getTitle() != null;
    

    @Override public void registerIdleTransitionCallback(ResourceCallback resourceCallback) 
        this.callback = resourceCallback;
    

创建自己的自定义空闲资源后,需要 通过致电注册 Espresso Espresso.registerIdlingResource(webViewIdlingResource).

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

如果它不起作用,请尝试与 Espresso 一起使用另一个名为 [uiatomator 的 Google 测试框架,这可能会帮助您处理此问题。

希望对你有帮助

【讨论】:

@AndroidMechanic 编辑了我的答案。你能改变你的笔记或sy我需要改进的地方吗?【参考方案2】:

您可以创建一个线程转储来查看是什么阻止了您的应用。有时,当您创建多个线程转储时会有所帮助。

【讨论】:

以上是关于Espresso 测试被后台线程阻塞。应用程序未空闲异常:“AppNotIdleException”。的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask 运行时 Espresso 测试返回按钮

espresso 测试“无法访问主线程上的数据库”时出现房间数据库错误

在 Espresso 测试中忽略 pressBack()

Android Espresso单元测试

Android Spinner在Espresso测试中点击后立即被解雇

简单测试Java线程安全中阻塞同步与非阻塞同步性能