使用Espresso实现完整覆盖的App功能测试

发表于:2017-5-15 11:03

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:何梁伟    来源:InfoQ

  不同线程 IdlingResource 的 bug
  在进行 UI 测试的时候,有两个主线程需要区分一下,一个是主 App 运行的主线程([main,5,main]),另一个是 UI 测试跑的主线程([Instr: android.support.test.runner.AndroidJUnitRunner,5,main])。我们触发的UI事件都是在 App 主线程里面执行的,如果我们想要在 App 的线程里面做一些操作需要切换到对应的线程操作。如下面的代码:
mActivityTestRule.getActivity().runOnUiThread
(new Runnable() {
@Override
public void run() {
LogUtils.d(TAG, "runOnUiThread..." +
Thread.currentThread());
TaskApi.Companion.getMyTasks(0, 10000, "",
new HSAPICallback
<TaskListResult>() {
public void onRequestSuccess(TaskListResult data,
int httpStatus,
Boolean fromCache) {
super.onRequestSuccess(data, httpStatus, fromCache);
mTasks = data.getDatas();
}
});
}
});
  理论上这里进行的异步操作应该和 App 里面执行的异步操作是一样的,可以用 IdlingResource 去守护这样一个后台操作,但是实际使用下来,虽然 IdlingResource 已经接受到对应的异步完成回调,但是并没有回调到被注册的 ResourceCallback。
  hasProperty 异常
  Espresso 用的是 Hamcrest 的语法来进行的验证,理论上应该支持所有 Hamcrest 的写法,但是当我们在使用 hasProperty 这个方法的时候,会发现下面这样的错误。这主要是由于 Android SDK 里面并没有完整 JDK 的库,我们用到这部分刚好在 Android SDK 没有。
java.lang.NoClassDefFoundError:
Failed resolution of: Ljava/beans/Introspector;
at org.hamcrest.beans.PropertyUtil.propertyDescriptorsFor
(PropertyUtil.java:47)
at org.hamcrest.beans.PropertyUtil.getPropertyDescriptor
(PropertyUtil.java:28)
at org.hamcrest.beans.HasPropertyWithValue.propertyOn
(HasPropertyWithValue.java:94)
at org.hamcrest.beans.HasPropertyWithValue.matchesSafely
(HasPropertyWithValue.java:81)
at org.hamcrest.TypeSafeDiagnosingMatcher.matches(
TypeSafeDiagnosingMatcher.java:55)
at org.hamcrest.core.AllOf.matches(AllOf.java:27)
at org.hamcrest.DiagnosingMatcher.matches
(DiagnosingMatcher.java:12)
at android.support.test.espresso.action.
AdapterDataLoaderAction.
perform(AdapterDataLoaderAction.java:83)
at android.support.test.espresso.ViewInteraction$1.run
(ViewInteraction.java:144)
at java.util.concurrent.Executors$RunnableAdapter.
call(Executors.java:422)
at java.util.concurrent.FutureTask.
run(FutureTask.java:237)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
  根据 Android espresso onData error
  这篇文章可以找到对应的解决方案,但是实际使用下来效果并不好,主要是 gradle 的 Android 插件在不同的版本里面对于引入 Java Core 的代码处理方式有差别,而且我用的 2.2.3 的版本根本就不能用,所以这里的建议绕过不要使用这个方法,我们最后是通过自己定义了一个 Match 来解决这个问题的。
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号