Моки в инструментальных тестах Android

Хрупкие тесты в CI — проблема тестировщика

Автоматизация должна ускорять тестирование, делать тесты детерминистичными (определенными) и надежными. Но так получается не всегда, вопреки планам, автотесты, особенно в инструментальном тестировании (instrumented testing) Android-приложений, часто становятся нестабильными (flaky).

Причины нестабильности тестов коротко (здесь подробнее):

  • Ошибки синхронизации между тестами и AUT-приложением
  • Вызовы между сервисами падают
  • Неупорядоченные тестовые данные
  • Тестовое окружение намного хуже по качеству чем прод-окружение
  • Test flow, слишком дотошно настроенный на нужный уровень валидации
  • 3rd-party-зависимости

Нестабильность автотестов в CI — одна из самых больших проблем в CI-процессах. Тесты не проходят, следовательно, замедляется темп разработки.

Один из возможных способов борьбы с нестабильностью тестов — “изолировать” приложение от всех зависимостей. Это удобно делать, применяя моки — “макеты” (иногда еще называют “каркасами”; здесь подробно о моках).

Как помнишь, пирамида тестирования выглядит так:

Когда применяют моки?

  • Mocking-фреймворк дает нужный уровень определенности, изолированности и стабильности.
  • Команды работают каждая в своем темпе, не отвлекаясь на не очень существенные задачи.
  • Ошибки симулируются и сразу отрабатываются; создаются negative user journeys. И для этого не надо менять настройки окружения, или переводить приложение в другое состояние, мешая другим командам.
  • Изолированность окружения — нет таких высоких требований к скорости сети

Моки — практический пример

Возьмем в пример Wiremock. Симулируем зависимости на сервере.

  1. Добавляем Wiremock-зависимости в gradle для Android-теста
Добавляем Wiremock-зависимости в gradle для Android-теста
  1. Встраиваем Wiremock в тесты

Wiremock работает по JUnit-правилам, что касается жизненного цикла сервера и задач setUp/teardown.

Запуск и остановка тест-кейса Wiremock — добавляем правило в класс теста:

Встраиваем Wiremock в тесты

! Внимание, сейчас надо проверить, что 8080 порт уже нигде не используется

  1. Перехватываем запрос и меняем URL на localhost

Создаем Interceptor для перехвата HTTPS и замены URL на http://127.0.0.1:8080.

Перехватываем запрос и меняем URL на localhost

Добавляем перехватчик в Network-модуль:

Добавляем перехватчик в Network-модуль
  1. Симулируем ответы. Их варианты:

4.1. Ответ с ошибкой. Ответ со статусом 400, возвращаемый когда URL = /mocked/url, а тип запроса — GET. Тело ответа будет jsonBody. Данные ошибки:

Ответ с ошибкой

4.2. Пустое тело ответа. Ответ со статусом 429, возвращаемый когда URL = /mocked/url, тип запроса — POST, и тело ответа пустое:

Пустое тело ответа

4.3. Успешный ответ. Возвращается статус 200, когда URL = /mocked/url, а тип запроса — PUT.

Успешный ответ

!RemoveStub удаляет stub mapping после каждого запуска теста, это финальные teardown-операции тестового класса:

RemoveStub
  1. Тесты с mock-симуляцией ответа

5.1. Тест проверяет наличие сообщения об ошибке в UI при получении статуса 400 и данными ошибки в JSON-теле:

Тесты с mock-симуляцией ответа

5.2. Тест проверяет отсутствие ошибки в UI при получении статуса 200:

Тесты с mock-симуляцией ответа

!Как и в предыдущем примере, применяется teardown для стирания stub mapping после каждого теста:

teardown для стирания stub mapping

Вот так моки в Wiremock упрощают QA-процессы. Главное пользоваться этой полезной штукой с умом, при необходимости, соблюдая KISS-принцип (Keep It Simple), иначе получится то что называется over-engineered.

Какой была ваша первая зарплата в QA и как вы искали первую работу?

Мега обсуждение в нашем телеграм-канале о поиске первой работы. Обмен опытом и мнения.

Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Мы в Telegram

Наш официальный канал
Полезные материалы и тесты
Готовимся к собеседованию
Project- и Product-менеджмент

? Популярное

? Telegram-обсуждения

Наши подписчики обсуждают, как искали первую работу в QA. Некоторые ищут ее прямо сейчас.
Наши подписчики рассказывают о том, как не бояться задавать тупые вопросы и чувствовать себя уверенно в новой команде.
Обсуждаем, куда лучше податься - в менеджмент или по технической ветке?
Говорим о конфликтных ситуациях в команде и о том, как их избежать
$1100*
медианная зарплата в QA в июне 2023

*по результатам опроса QA-инженеров в нашем телеграм-канале

Собеседование

19%*
IT-специалистов переехало или приняло решение о переезде из России по состоянию на конец марта 2022

*по результатам опроса в нашем телеграм-канале

live

Обсуждают сейчас