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”而失败

使用 espresso 运行的 UIAutomator