12

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

我试过getActivity().finish()tearDown()
试过solo.finalize()了,实际上是一样的。

有没有办法在每次测试运行开始时拥有一个新的应用程序?(使用机器人)。
有没有办法在测试结束时以编程方式杀死应用程序?
我正在使用ActivityInstrumentationTestCase2Robotium

4

7 回答 7

5

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

于 2012-06-19T01:42:10.683 回答
2

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

    Intent i = new Intent();
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    setActivityIntent(i);
    solo = new Solo(getInstrumentation(), getActivity());
于 2012-07-26T01:34:25.363 回答
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;
        }
    }
}
于 2012-02-06T23:54:55.463 回答
1

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

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

您不应该将您的Robotium测试视为普通的单元测试(它们不是!),而应将其视为用户案例,验收测试。因此,如果您想关闭应用程序,请在这些测试中完全按照您希望用户关闭应用程序所做的操作。

于 2011-12-13T10:59:41.673 回答
0

If you run your build with maven or ant (Robotium is a convenience wrapper for JUnit-Tests), there is an option to fork a new process for every test class or even test case. This provides clean environment, but slows down test execution.

I personally prefer to stick with vanilla Junit / TestNG and utilize mocking (with jMockit) to assure proper interaction beween my code and android. See sample here:

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

于 2011-12-12T09:10:00.713 回答
0

我的解决方案:

    @Override
    public void tearDown() throws Exception {

        solo.finishOpenedActivities();

        super.tearDown();
    }
于 2017-11-16T20:18:01.787 回答
0

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

于 2016-01-07T07:22:45.507 回答