我有多个UI测试。当我进行一次测试时,一切都很好。但是如果我运行一批(作为CI构建的一部分)测试失败,因为首先进行的测试会改变应用程序的状态,并且下一个测试会受到这些更改的影响。 (因为应用程序没有被杀死)。
我在getActivity().finish()
中尝试了tearDown()
尝试solo.finalize()
实际上做了同样的事情。
有没有办法在每次测试开始时都有一个新的应用程序? (使用Robotium)。
是否有一种方法可以在测试结束时以编程方式终止应用程序?
我正在使用ActivityInstrumentationTestCase2
和Robotium
答案 0 :(得分:5)
或者只是添加solo.finishOpenedActivities();
答案 1 :(得分:3)
不完全确定您的测试套件的性质,但我遇到了运行多个“全新启动”测试并挂在第二次测试时出现问题。我的问题与产生的活动有关,并通过使用FLAG_ACTIVITY_CLEAR_TOP启动活动来恢复 - 当然这会清除堆栈,但我认为这就是你想要的?
Intent i = new Intent();
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
setActivityIntent(i);
solo = new Solo(getInstrumentation(), getActivity());
答案 2 :(得分:1)
为什么不添加一种“杀死”应用的临时方式,具体取决于您正在测试的特定应用? 例如,根据您的应用程序活动深度,“按3次”或类似的东西就足够了。
您可以在测试超类的tearDown
方法中添加它,以便在每次测试后运行它。
你应该考虑你的Robotium
测试不是正常的单元测试(它们不是!),而是用户案例,验收测试。因此,如果您想要关闭应用程序,请在这些测试中完全按照您希望用户关闭应用程序的方式进行操作。
答案 3 :(得分:1)
问题的原因是:
Robotium使用变通方法,但它在ActivityInstrumentationTestCase2测试用例开始活动后设置了ActivityMonitor,即:
Activity activity = getActivity();
Solo solo = new Solo(getInstrumentation(), activity);
如果您的被测活动是转发活动,则可能在Solo注册其ActivityMonitor之前启动目标活动。 Solo.finishOPenedActivities()依赖于它从ActivityMonitor收集的列表。
根据@Guillaume answer,我从测试用例或者tearDown()中调用此方法:
private void backOutToHome() {
boolean more = true;
while(more) {
try {
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
} catch (SecurityException e) { // Done, at Home.
more = false;
}
}
}
答案 4 :(得分:0)
如果使用maven或ant运行构建(Robotium是JUnit-Tests的便利包装器),可以选择为每个测试类甚至测试用例分叉一个新进程。这提供了干净的环境,但减慢了测试执行速度。
我个人更喜欢坚持使用vanilla Junit / TestNG并利用mocking(使用jMockit)来确保我的代码和android之间的正确交互。请参见此处的示例:
答案 5 :(得分:0)
您可以尝试删除super.tearDown();
答案 6 :(得分:0)
我的解决方案:
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
super.tearDown();
}