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

Функциональное тестирование включает в себя проверку того, что отдельные компоненты приложения работают вместе как ожидается пользователем. Например, вы можете создать функциональный тест, чтобы убедиться, что Activity Activity правильно запускает целевую Activity когда пользователь выполняет взаимодействие с пользовательским интерфейсом.

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

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

Добавление тестового метода для проверки функционального поведения

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

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

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

@MediumTest
public void testSendMessageToReceiverActivity() {
    final Button sendToReceiverButton = (Button) 
            mSenderActivity.findViewById(R.id.send_message_button);

    final EditText senderMessageEditText = (EditText) 
            mSenderActivity.findViewById(R.id.message_input_edit_text);

    // Set up an ActivityMonitor
    ...

    // Send string input value
    ...

    // Validate that ReceiverActivity is started
    ...

    // Validate that ReceiverActivity has the correct data
    ...

    // Remove the ActivityMonitor
    ...
}

Тест ждет Activity , который соответствует этому монитору, в противном случае возвращает null после истечения тайм-аута. Если ReceiverActivity была запущена, ActivityMonitor , который вы создали ранее, получает событие. Вы можете использовать методы утверждений для проверки того, что ReceiverActivity действительно запущена, и что число событий в ActivityMonitor увеличивается, как и ожидалось.

Настройка ActivityMonitor

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

Как правило, для использования ActivityMonitor, вы должны:

  1. Получить Instrumentation экземпляр для вашего теста с помощью getInstrumentation() метода.
  2. Добавить экземпляр Instrumentation.ActivityMonitor к текущему инструментарию с помощью одного из Instrumentation addMonitor() методов. Критерии поиска могут быть определены как IntentFilter или строки с именем класса.
  3. Подождите, пока Activity запуститься.
  4. Убедитесь, что число событий монитора увеличивается.
  5. Удалите монитор.

Например:

// Set up an ActivityMonitor
ActivityMonitor receiverActivityMonitor =
        getInstrumentation().addMonitor(ReceiverActivity.class.getName(),
        null, false);

// Validate that ReceiverActivity is started
TouchUtils.clickView(this, sendToReceiverButton);
ReceiverActivity receiverActivity = (ReceiverActivity) 
        receiverActivityMonitor.waitForActivityWithTimeout(TIMEOUT_IN_MS);
assertNotNull("ReceiverActivity is null", receiverActivity);
assertEquals("Monitor for ReceiverActivity has not been called",
        1, receiverActivityMonitor.getHits());
assertEquals("Activity is of wrong type",
        ReceiverActivity.class, receiverActivity.getClass());

// Remove the ActivityMonitor
getInstrumentation().removeMonitor(receiverActivityMonitor);

Отправка ввода с клавиатуры с помощью инструментария

Если ваша Activity имеет EditText поле, вы возможно захотите проверить, что пользователи могут вводить значения в EditText объект.

Как правило, для отправки значение строки в EditText объект в ActivityInstrumentationTestCase2, вы должны:

  1. Используйте runOnMainSync() метод для запуска requestFocus() вызвать синхронно в цикле. Таким образом, поток пользовательского интерфейса блокируется, пока не будет получен фокус.
  2. Вызовите waitForIdleSync() метод для ожидания перехода главного потока в состояние простоя (то есть, у него нет больше событий для обработки).
  3. Отправьте текстовую строку в EditText с помощью вызова sendStringSync() и передачи вашей входной строки в качестве параметра.

Например:

// Send string input value
getInstrumentation().runOnMainSync(new Runnable() {
    @Override
    public void run() {
        senderMessageEditText.requestFocus();
    }
});
getInstrumentation().waitForIdleSync();
getInstrumentation().sendStringSync("Hello Android!");
getInstrumentation().waitForIdleSync();