Robotium。 在测试套件中,每个下一个测试都受到先前测试的影响

我有多个UI测试。 当我运行单个测试时,一切正常。 但是如果我运行它们(作为CI构建的一部分)测试失败,因为首先测试会改变应用程序的状态,并且下一个测试会受到这些更改的影响。 (因为应用程序没有被杀死)。

我在tearDown()尝试了getActivity().finish() tearDown()
试过solo.finalize()实际上做了同样的solo.finalize()

有没有办法在每次测试开始时都有一个新的应用程序? (使用Robotium)。
有没有办法在测试结束时以编程方式杀死应用程序?
我正在使用RobotI的ActivityInstrumentationTestCase2

为什么不添加一种“杀死”应用程序的临时方式,具体取决于您正在测试的特定应用程序? 例如,根据您的应用程序活动深度, “按3次”或类似的东西可能足够好。

您可以在测试超类的tearDown方法中添加它,以便在每次测试之后运行它。

您应该将您的Robotium测试视为正常的unit testing(它们不是!),而是作为用户案例,验收测试 。 因此,如果您要关闭应用程序,请在这些测试中完全按照您希望用户执行的操作来关闭应用程序。

或者只是添加solo.finishOpenedActivities();

不完全确定您的测试套件的性质,但我遇到了运行多个“全新启动”测试并挂在第二次测试时出现问题。 我的问题与产生的活动有关,并通过使用FLAG_ACTIVITY_CLEAR_TOP启动活动来恢复 – 当然这会清除堆栈,但我认为这就是你想要的?

  Intent i = new Intent(); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); setActivityIntent(i); solo = new Solo(getInstrumentation(), getActivity()); 

问题的原因是:

  1. 没有Android API来获取堆栈中所有活动的列表。
  2. (1)的解决方法是使用ActivityMonitor来跟踪每个启动的Activity。
  3. Robotium使用变通方法,但它在ActivityInstrumentationTestCase2测试用例开始其活动后设置其ActivityMonitor,即:

     Activity activity = getActivity(); Solo solo = new Solo(getInstrumentation(), activity); 

如果您的被测活动是转发活动,则可能在Solo注册其ActivityMonitor之前启动目标活动。 Solo.finishOPenedActivities()依赖于它从ActivityMonitor收集的列表。

根据@Guillaume的回答 ,我从测试用例或者tearDown()中调用这个方法:

 private void backOutToHome() { boolean more = true; while(more) { try { getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); } catch (SecurityException e) { // Done, at Home. more = false; } } } 

如果使用maven或ant运行构建(Robotium是JUnit-Tests的便利包装器),则可以选择为每个测试类甚至测试用例分叉一个新进程。 这提供了干净的环境,但减慢了测试执行速度。

我个人更喜欢坚持使用vanilla Junit / TestNG并利用mocking(使用jMockit)来确保我的代码和android之间的正确交互。 看这里的样本:

https://github.com/ko5tik/andject/blob/master/src/test/java/de/pribluda/android/andject/ViewInjectionTest.java

你可以尝试删除super.tearDown();

我的解决方案

  @Override public void tearDown() throws Exception { solo.finishOpenedActivities(); super.tearDown(); }