Тестирование компонентов пользовательского интерфейса

Как правило, ваша Activity включает компоненты пользовательского интерфейса (такие как кнопоки, редактируемые текстовые поля, флажки и элементы выбора), чтобы пользователи могли взаимодействовать с вашим Android приложением. Этот урок показывает, как можно протестировать Activity с простой кнопкой. Вы можете использовать те же основные шаги, чтобы проверить другие, более сложные типы компонентов пользовательского интерфейса.

Примечание: Тип тестирования пользовательского интерфейса в этом уроке, называется тестирование белого ящика потому у вас есть исходный код приложения, который вы хотите проверить. Android Инструментарий подходит для создания тестов белого ящика для компонентов пользовательского интерфейса в приложении. Альтернативным типом тестирования пользовательского интерфейса является тестирование черного ящика, где вы не можете иметь доступ к исходному коду приложения. Этот тип тестирования полезен, когда вы хотите проверить, как ваше приложение взаимодействует с другими приложениями или с системой. Тестирование черного ящика не рассматривается в этом курсе. Чтобы узнать больше о том, как выполнить тестирование черного ящика на ваших Android приложениях, см. Руководство по тестированию пользовательского интерфейса.

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

Создание теста для проверки пользовательского интерфейса с помощью инструментария

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

Чтобы безопасно внедрять Intent объекты в вашу Activity или запустить методы испытаний в потоке пользовательского интерфейса, вы можете расширить свой тестовый класс от ActivityInstrumentationTestCase2. Чтобы узнать больше о том, как запустить тестовые методы в потоке пользовательского интерфейса см. Тестирование в потоке пользовательского интерфейса.

Создайте свой испытательный стенд

При настройке испытательного стенда для тестирования пользовательского интерфейса, необходимо указать режим прикосновений в вашем setUp() методе. Установка сенсорного режима в true предотвращает управления пользовательским интерфейсом от принятия фокуса при его программном нажатии в методе испытания позже (например, кнопка пользовательского интерфейса просто вызовет события нажатия у слушателя событий). Убедитесь, что вы вызвали setActivityInitialTouchMode() перед вызовом getActivity().

Например:

public class ClickFunActivityTest
        extends ActivityInstrumentationTestCase2
       
         {
    ...
    @Override
    protected void setUp() throws Exception {
        super.setUp();

        setActivityInitialTouchMode(true);

        mClickFunActivity = getActivity();
        mClickMeButton = (Button) 
                mClickFunActivity
                .findViewById(R.id.launch_next_activity_button);
        mInfoTextView = (TextView) 
                mClickFunActivity.findViewById(R.id.info_text_view);
    }
}

       

Добавление тестовых методов для проверки поведения пользовательского интерфейса

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

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

В следующем разделе показано, как можно реализовать методы испытаний для выполнения этих проверок.

Проверьте параметры расположения кнопок

Вы можете добавить метод испытания как этот, чтобы проверить, что кнопка отображается правильно в вашей Activity:

@MediumTest
public void testClickMeButton_layout() {
    final View decorView = mClickFunActivity.getWindow().getDecorView();

    ViewAsserts.assertOnScreen(decorView, mClickMeButton);

    final ViewGroup.LayoutParams layoutParams =
            mClickMeButton.getLayoutParams();
    assertNotNull(layoutParams);
    assertEquals(layoutParams.width, WindowManager.LayoutParams.MATCH_PARENT);
    assertEquals(layoutParams.height, WindowManager.LayoutParams.WRAP_CONTENT);
}

В assertOnScreen() методе, вам нужно передать корневое представление и представление, присутствовать на экране которого вы ожидали. Если ожидаемое представление не найдено в корневом представлении, метод бросает AssertionFailedError исключение, в противном случае тест пройден.

Вы также можете проверить, что макет Button правильный, получив ссылку на его ViewGroup.LayoutParams объект, а затем вызвать методы для проверки, что Button атрибуты ширины и высоты соответствуют ожидаемым значениям.

@MediumTest аннотация определяет категорию теста, по отношению к его абсолютному времени выполнения. Чтобы узнать больше об использовании аннотаций тестов см. Добавление аннотаций теста.

Проверка параметров расположения TextView

Вы можете добавить метод испытания как этот, чтобы проверить, что TextView в начале скрыт в вашей Activity:

@MediumTest
public void testInfoTextView_layout() {
    final View decorView = mClickFunActivity.getWindow().getDecorView();
    ViewAsserts.assertOnScreen(decorView, mInfoTextView);
    assertTrue(View.GONE == mInfoTextView.getVisibility());
}

Вы можете вызвать getDecorView() чтобы получить ссылку на представление оформления для Activity. Представление оформления это представление верхнего уровня ViewGroup(FrameLayout) в иерархии макета.

Проверка поведения кнопок

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

@MediumTest
public void testClickMeButton_clickButtonAndExpectInfoText() {
    String expectedInfoText = mClickFunActivity.getString(R.string.info_text);
    TouchUtils.clickView(this, mClickMeButton);
    assertTrue(View.VISIBLE == mInfoTextView.getVisibility());
    assertEquals(expectedInfoText, mInfoTextView.getText());
}

Чтобы программно нажать Button в вашем тесте, вызовите clickView(). Вы должны передать ссылку на тест, который запускается и ссылку на Button для манипуляции.

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

Внимание: TouchUtils методы предназначены для безопасной отправки событий в поток пользовательского интерфейса из тестового потока. Вы не должны запускать TouchUtils непосредственно в потоке пользовательского интерфейса или любого тестового метода с аннотацией @UIThread. Это может привезти к возникновению WrongThreadException.

Добавление аннотаций теста

Следующие аннотации могут быть добавлены для указания размера тестового метода:

@SmallTest
Отмечает тест, который должен работать в рамках небольших тестов.
@MediumTest
Отмечает тест, который должен работать как часть тестов средних размеров.
@LargeTest
Отмечает тест, который должен работать в рамках крупных тестов.

Как правило, быстро выполняемый тест, который занимает всего несколько миллисекунд должен быть помечены как @SmallTest. Более медленные тесты (100 миллисекунд или больше), как правило, помечаются как @MediumTestили @LargeTest, в зависимости от того, обращается ли тест к ресурсам только в локальной системе или к удаленным ресурсам по сети. Для дополнительной информации по использованию аннотаций размера теста, см. Android Tools Protip.

Вы можете отметить ваши методы другими аннотациями для контроля организации и выполнения тестов. Для получения дополнительной информации о других аннотациях см. Annotation описание класса.