Создание модульных тестов

Модульное тестирование Activity является отличным способом, чтобы быстро проверить состояние Activity и её взаимодействия с другими компонентами в изоляции (то есть, отсоединенной от остальной части системы). Модульный тест обычно проверяет наименьший возможный блок кода (который может быть методом, классом или компонентом), без зависимостей от системы или сетевые ресурсы. Например, вы можете написать модульный тест, чтобы проверить, что Activity имеет правильный макет или что она вызывает Intent объект правильно.

Модульные тесты, как правило, не подходит для тестирования сложных событий взаимодействия пользовательского интерфейса с системой. Вместо этого вы должны использовать ActivityInstrumentationTestCase2 класс, как описано в Тестирование компонентов пользовательского интерфейса.

Этот урок показывает, как можно написать модульный тест, чтобы проверить, что Intent срабатывает для запуска другой Activity. Поскольку тест выполняется в изолированной среде, Intent на самом деле не посылается в Android систему, но вы можете проверить, что данные объекта Intent являются правильными.

Для просмотра завершенного примера теста, взгляните на LaunchActivityTest.java в примере приложения.

Примечание: Для проверки с системой или внешними зависимостями, вы можете использовать фиктивные объекты из библиотек и внедрять их в модульные тесты. Чтобы узнать больше о библиотеки фиктивных объектов предоставляемых Android, см. Фиктивные классы объектов.

Создание теста для модульного тестирования Activity

ActivityUnitTestCase класс обеспечивает поддержку изолированного тестирования одной Activity. Для создания модульного теста для вашей Activity, ваш тестовый класс должен расширять ActivityUnitTestCase.

Activity в ActivityUnitTestCase не запускается автоматически инструментарием Android. Для запуска Activity в изоляции, необходимо явно вызвать startActivity() метод, и передать Intent для запуска вашей целевой Activity.

Например:

public class LaunchActivityTest
        extends ActivityUnitTestCase<LaunchActivity> {
    ...

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        mLaunchIntent = new Intent(getInstrumentation()
                .getTargetContext(), LaunchActivity.class);
        startActivity(mLaunchIntent, null, null);
        final Button launchNextButton =
                (Button) getActivity()
                .findViewById(R.id.launch_next_activity_button);
    }
}

Проверка запуска другой Activity

Ваши цели модульного тестирования могут включать:

  • Проверка того, что LaunchActivity вызывает Intent когда нажимается кнопка.
  • Проверка того, что запущенный Intent содержит правильные данные.

Чтобы убедиться в том, что Intent был вызван после нажатия на Button , вы можете использовать getStartedActivityIntent() метод. Используя методы проверки, вы можете убедиться, что возвращенный Intent не является нулевым, и что он содержит ожидаемое значение строки для запуска следующей Activity. Если оба утверждения равны true, вы успешно проверили, что Intent правильно послан из вашей Activity.

Вы могли бы реализовать свой метод испытания, как этот:

@MediumTest
public void testNextActivityWasLaunchedWithIntent() {
    startActivity(mLaunchIntent, null, null);
    final Button launchNextButton =
            (Button) getActivity()
            .findViewById(R.id.launch_next_activity_button);
    launchNextButton.performClick();

    final Intent launchIntent = getStartedActivityIntent();
    assertNotNull("Intent was null", launchIntent);
    assertTrue(isFinishCalled());

    final String payload =
            launchIntent.getStringExtra(NextActivity.EXTRAS_PAYLOAD_KEY);
    assertEquals("Payload is empty", LaunchActivity.STRING_PAYLOAD, payload);
}

Т.к. LaunchActivity работает в изоляции, вы не можете использовать TouchUtils библиотеку для управления пользовательским интерфейсом. Чтобы непосредственно нажать на Button, вы можете вызвать performClick() метод вместо этого.