Как протестировать две активности с помощью Robotium

Я тестирую свое Android-приложение с помощью Robotium и периодически сталкиваюсь с одной проблемой. Мое приложение начинается с SigninActivity, которая позволяет пользователю войти в систему, и после этого он направляется ко второму действию, имеющему список, который заполняется после запроса к веб-серверу.

Первый вопрос: поскольку ко всем моим действиям можно получить доступ только после того, как пользователь вошел в систему, мне нужно запускать каждый тест для каждого действия с экрана входа в систему. Итак, что я делаю для каждого класса тестов активности, я наследую его от

ActivityInstrumentationTestCase2<SigninActivity>

и в методе setUp я вхожу в систему пользователя. Это правильный подход?

Второй вопрос: я хочу проверить данные списка во втором действии, которое заполняется после запроса к веб-серверу. Как упоминалось выше, в моем методе настройки я вхожу в систему и использую

solo.waitForActivity(SecondActivity.class, BIG_TIMEOUT)
solo.waitForView(ListView.class)

чтобы гарантировать, что второе действие и список присутствуют. Проблема в том, что даже с этой проверкой я часто получаю

junit.framework.AssertionFailedError: Can not click on line number 2 as there are only 0 lines available

person Raphael Oliveira    schedule 15.04.2013    source источник


Ответы (2)


Я смог протестировать несколько действий в своем приложении, используя следующий подход:

  1. начать первую активность
  2. сделать что-то в действии (например, нажать кнопку, которая запускает новое действие)
  3. дождитесь 2-го действия.
  4. сделать что-то во 2-м действии (например, ввести текст ввода, а затем нажать другую кнопку)
  5. и Т. Д.

пример кода: public void testDisplayBlackBox() {

    //Click on add ident button
    solo.clickOnButton("Tap to get another number");
    if (solo.waitForActivity(IdentityTemplateActivity.class)) {
        // select ident type
        solo.clickOnImageButton(0);

        // add name/label and create ident
        if (solo.waitForActivity(NumberDetailActivity.class)) {
            solo.enterText(0, "Robotium");
            solo.enterText(1, "test 1");    
            solo.clickOnImageButton(6);
        }
    }
person droideckar    schedule 18.07.2013

Во-первых, писать логический код в методе setUp — не лучшая идея. Я бы порекомендовал вам использовать тот факт, что тестовые случаи запускаются в алфавитном порядке - создайте один тестовый метод с логином, а затем вы входите в свое приложение в остальных из них (если этот случай запускается первым), поэтому вы не должны войти в систему перед каждым методом тестирования.

О вашем втором вопросе: solo.waitForView(ListView.class) ждет указанное время (я не помню, что по умолчанию), но вы этого не утверждаете. Вы должны скорее использовать:

assertTrue(solo.waitForView(ListView.class));

Однако, похоже, проблема с ListView. Убедитесь, что у вас есть только одно представление списка на экране, иначе вам придется использовать его индекс:

solo.clickInList(int line, int index)
person maszter    schedule 15.04.2013
comment
Ну, насколько я понимаю, тесты должны быть независимы друг от друга, поэтому использовать тот факт, что они выполняются в каком-то порядке, для меня неприятный запах. - person Raphael Oliveira; 16.04.2013
comment
В противном случае вам придется входить в систему перед каждым тестовым случаем и выходить после него. Другой вариант — проверять перед каждым тестовым случаем и делать это, если вы этого не делаете. - person maszter; 16.04.2013