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”。的主要内容,如果未能解决你的问题,请参考以下文章
espresso 测试“无法访问主线程上的数据库”时出现房间数据库错误