我的 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)
作为一个开始:
Espresso for Android 是完美且快速的测试自动化框架,
但它有一个重要的限制——你只能操作
在测试上下文下的应用程序内。
From:
http://qathread.blogspot.com/2015/05/espresso-uiautomator-perfect-tandem.html
代表着Espresso要执行任何操作都需要在应用程序的主线程上操作。它检查 UI 线程何时idle()
如果没有,它会等待,直到 UI 线程再次空闲。
如果 UI 线程没有空闲太久,它会产生Espressso IdlingResources
错误如AppNotIdleException, 意思是:
异常,表明应用程序在指定的持续时间后仍未空闲。
为了解决这个问题,你需要创建自己的IdlingResource方法说Espresso
当 UI 线程是idle()
为了它。
让我们更深入地研究一下问题:
浓缩咖啡引入了这个概念IdlingResource
,这是一个简单的
接口:
代表被测应用程序的资源
这可能会导致测试期间发生异步后台工作
执行
接口定义three方法:
- getName():必须返回一个非空字符串,用于标识空闲资源。
- isIdleNow():返回空闲资源当前的空闲状态。如果返回 true,则 onTransitionToIdle() 方法
注册的 ResourceCallback 必须先前已被调用。
- registerIdleTransitionCallback(IdlingResource.ResourceCallback回调):通常该方法用于存储对
回调以通知其空闲状态发生变化。
例如,等待空闲资源的实现
在 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;
}
}
创建您自己的自定义空闲资源后,需要将其
通过致电注册 EspressoEspresso.registerIdlingResource(webViewIdlingResource)
.
From:http://dev.jimdo.com/2014/05/09/wait-for-it-a-deep-dive-into-espresso-s-idling-resources/
如果它不起作用尝试与Espresso
另一个 Google 测试框架称为 [uiatomator
,这可能会帮助您解决这个问题。
希望它会有所帮助
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)