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

12

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

我尝试在tearDown()中使用getActivity().finish()
还尝试了做同样操作的solo.finalize()

是否有办法在每次测试运行开始时拥有一个全新的应用程序?(使用Robotium)。
并且是否有方法在测试结束时以编程方式终止应用程序?
我正在使用带有Robotium的ActivityInstrumentationTestCase2


这可能会稍微减慢你的测试速度。你尝试过将应用程序重置回已知状态作为设置过程,而不是实际杀死它并重新初始化吗? - squawknull
我的测试影响的应用程序属性(应用程序状态的一部分)在启动时初始化。因此,我无法在不改变应用程序工作方式的情况下进行测试。整个测试概念是关于具有隔离运行的,但在 Android 测试中,至少在 UI 测试方面,这种隔离被破坏了。我认为这应该被视为一个根本性的问题,但我似乎找不到任何关于这个问题的信息。 - Taras
我同意。我遇到了完全相同的问题:使用Robotium进行单个测试非常好,但是当您尝试在同一仪器运行中有2个测试时,第二个测试将永远挂起。 我也尝试完成和结束所有活动,但是没有任何作用。Robotium应该解决此问题。他们的示例始终只有一个测试类。 - Snicolas
7个回答

5
或者只需添加solo.finishOpenedActivities();

2

我不确定你的测试套件的具体性质,但是我在运行多个“全新启动”测试时遇到了问题,第二个测试卡住了。我的问题与生成的活动有关,通过使用FLAG_ACTIVITY_CLEAR_TOP启动活动解决了这个问题 - 当然,这会清除堆栈,但我认为这正是你想要的?

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

这对我有用,谢谢!另外,由于我有一个确认对话框来退出我的应用程序,solo.finishOpenedActivities()无法解决问题,必须使用solo.goBack()并在对话框中点击适当的按钮。 - user1092196

1

问题的原因是:

  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;
        }
    }
}

1
为什么不添加一种“杀死”应用程序的临时方法,具体取决于您正在测试的特定应用程序呢? 例如,根据您的应用程序活动深度,“按三次返回键”或类似操作可能已经足够了。
您可以将其添加到测试超类的tearDown方法中,以便在每个测试之后运行。
您应该将Robotium测试视为用户用例、验收测试,而不是普通的单元测试。因此,如果您想关闭应用程序,请在这些测试中执行与用户关闭应用程序相同的操作。

我会尽快尝试并给你一些反馈。 - Snicolas
单元测试运行器在被测应用停止时崩溃了。 [回声]测试包:story.album [执行] [执行]story.album.Album1Story : [执行]INSTRUMENTATION_RESULT: shortMsg=进程已崩溃。 [执行]INSTRUMENTATION_CODE: 0 - Snicolas
我已经完成了。需要更新很多测试。但是工作正常。一个缺点是,如果测试发生变化,您需要确保此“清理”代码也得到更新。 - Taras

0

我的解决方案:

    @Override
    public void tearDown() throws Exception {

        solo.finishOpenedActivities();

        super.tearDown();
    }

0

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


0

实际上,在Android上运行测试时,必须使用adb shell am instrument,而不是junit。似乎没有任何方法通过adb为每个测试分叉进程。 - Snicolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接