我正在使用Espresso为我的应用程序编写UI测试。我想测试一个事实,即如果在服务器请求正在进行时单击后退按钮,则该应用程序必须保持在原来的位置。AsyncTask运行时的Espresso测试返回按钮
由于espresso的体系结构,如果某些后台操作(如AsyncTask)被触发,测试执行将会等待,这似乎是不可能的。
那么,如何测试以下情形:
- 点击即触发一个的AsyncTask
- 测试一个按钮,而正在运行的任务,我按后退按钮,该应用程序在那里停留?
它可能吗?
谢谢
我正在使用Espresso为我的应用程序编写UI测试。我想测试一个事实,即如果在服务器请求正在进行时单击后退按钮,则该应用程序必须保持在原来的位置。AsyncTask运行时的Espresso测试返回按钮
由于espresso的体系结构,如果某些后台操作(如AsyncTask)被触发,测试执行将会等待,这似乎是不可能的。
那么,如何测试以下情形:
它可能吗?
谢谢
可以防止应用程序按下后退按钮时触发finish()
。为此,只需覆盖public void onBackPressed()
而不致电super.onBackPressed()
。就像:
@Override
public void onBackPressed() {
// super.onBackPressed();
}
此外,如果你是显示在执行任务对话框,您可以使用
myDialog.setCancelable(false);
myDialog.setCanceledOnTouchOutside(false);
以防止按下按钮。
Regards,
这很棘手。使用AsyncTasks
任务运行时,您无法使用Espresso。 如果您使用其他方式进行后台工作,Espresso不会等待,并且测试在完成后台工作之前完成。
一个简单的解决方法是在任务运行时不用Espresso“按下”后退按钮。因此,启动任务,调用Activity.onBackPressed()
并在任务完成之后用咖啡来检查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()将导致不同的行为,因为它将在任务完成后执行,并且任务完成时后退按钮的行为不同 – Apperside
我知道测试是自动化的,你不能自己点击它。当你使用我的答案中的代码时,''onBackPressed()'将在AsyncTask运行时执行。但是,如果任务在启动后即刻完成或很快完成,则可能会在任务之后调用onBackPressed()。你试过我的解决方案吗?什么确切不起作用? – thaussma
我没有试过它jet,但是因为我在考虑当你的例子的第一条指令被执行时,测试执行在那里停止,只有当任务完成时才前进。无论如何,我会试一试 – Apperside