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

时间:2011-10-21 15:02:47

标签: java android robotium gui-testing

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

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

有没有办法在每次测试开始时都有一个新的应用程序? (使用Robotium)。
是否有一种方法可以在测试结束时以编程方式终止应用程序? 我正在使用ActivityInstrumentationTestCase2和Robotium

7 个答案:

答案 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)

问题的原因是:

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

    Activity activity = getActivity();
    Solo solo = new Solo(getInstrumentation(), activity);
    
  4. 如果您的被测活动是转发活动,则可能在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之间的正确交互。请参见此处的示例:

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我的解决方案:

    @Override
    public void tearDown() throws Exception {

        solo.finishOpenedActivities();

        super.tearDown();
    }