AsyncTask 运行时 Espresso 测试返回按钮
Posted
技术标签:
【中文标题】AsyncTask 运行时 Espresso 测试返回按钮【英文标题】:Espresso test back button while AsyncTask is running 【发布时间】:2016-07-14 14:35:54 【问题描述】:我正在使用 Espresso 为我的应用程序编写 UI 测试。我想测试一下,如果我在服务器请求正在进行时单击后退按钮,则应用程序必须保持在原处。
这似乎是不可能的,因为 espresso 的架构会在触发某些后台操作(如 AsyncTask)时使测试执行等待。
那么,我该如何测试以下场景:
单击触发 AsyncTask 的按钮 测试当任务运行时我按下返回按钮时,应用程序会停留在那里吗?有可能吗?
谢谢
【问题讨论】:
【参考方案1】:这很棘手。使用AsyncTasks
,您无法在任务运行时使用 Espresso。
如果您要使用其他东西进行后台工作,Espresso 不会等待,并且测试会在后台工作之前完成。
一个简单的解决方法是在任务运行时在不使用 Espresso 的情况下“按下”返回按钮。所以,启动任务,调用Activity.onBackPressed()
,任务完成后使用Espresso检查Activity
是否仍然可见:
// Start the async task
onView(withId(R.id.start_task_button)).perform(click());
// Then "press" the back button (in the ui thread of the app under test)
mActivityTestRule.runOnUiThread(new Runnable()
@Override
public void run()
mActivityTestRule.getActivity().onBackPressed();
);
// Then check that the Activity is still visible
// (will be performed when the async task has finished)
onView(withId(R.id.any_view_on_activity)).check(matches(isDisplayed()));
【讨论】:
您好,我正在自动执行此测试,因此它们不会手动运行,因此我无法手动单击按钮。启动任务后调用 Activity.onBackPressed() 将导致不同的行为因为它会在任务之后执行,而当任务完成后返回按钮的行为是不同的 我知道测试是自动化的,你不能自己点击它。当您使用我的答案中的代码时,onBackPressed()
将在 AsyncTask
运行时执行。但如果任务立即完成或在启动后不久完成,则可能会在任务之后调用onBackPressed()
。你试过我的解决方案了吗?什么确切不起作用?
我没试过jet,但是因为我在想当你的例子的第一条指令被执行时,测试执行会停在那里,只有在任务完成时才会继续。无论如何,我会试一试
没有测试继续,点击后直接执行runOnUiThread
。点击后 Espresso 不会等待。 Espresso 在执行操作之前等待,而不是之后。但是我的示例的最后一条指令将被阻止,直到任务完成(这是预期的)。
mActivityTestRule.runOnUiThread
对我不起作用,无论如何它在perform(click())
之后执行【参考方案2】:
您可以阻止应用程序在按下返回按钮时触发finish()
。为此,只需覆盖public void onBackPressed()
而无需调用super.onBackPressed()
。就像:
@Override
public void onBackPressed()
// super.onBackPressed();
另外,如果你在执行任务时显示一个对话框,你可以使用
myDialog.setCancelable(false);
myDialog.setCanceledOnTouchOutside(false);
防止按钮被按下。
问候,
【讨论】:
以上是关于AsyncTask 运行时 Espresso 测试返回按钮的主要内容,如果未能解决你的问题,请参考以下文章
Espresso 在云中的设备上运行时抛出“在视图中执行“单击”时出错”,但相同的测试在本地成功运行
使用 Android-Espresso 运行多个测试时出现内存不足异常
Android Marshmallow:使用 Espresso 测试权限?
Android Espresso - 如何为所有测试只运行一次设置
Android Espresso UI 测试 - 测试运行失败:仪器运行因“java.lang.IllegalAccessError”而失败