Найти тему
SimbirSoft

Моки для чайников: термины, инструменты и «Hello, world!»

Оглавление

Привет! Меня зовут Наталья, я SDET-специалист в компании SimbirSoft.

Эта статья посвящается тем, кто еще ни разу не работал с моками и хочет на простом примере попробовать их на практике.

Коротко о том, что это такое

Mock-объекты (тестовые дублеры) — это объекты, предназначенные для симуляции поведения реальных объектов во время тестирования.

Тестовые дублеры позволяют:

  • зафиксировать тестовое окружение, имитируя неважные, нереализованные, нестабильные или медленные внешние объекты (например, БД или сервер),
  • совершать проверки своих вызовов (обращений к функциям, свойствам).

Самая популярная классификация включает 5 видов тестовых дублеров, различных по своим свойствам: Dummy (пустышка), Fake (фейк), Stub (стаб), Spy (шпион) и, собственно, Mock (мок). Их можно разделить на два типа: моки (mock, spy) и стабы (stub, dummy, fake). Первые работают с исходящими взаимодействиями (например, отправка электронной почты), а вторые с входящими (например, чтение данных из очереди). Почитать об этих и остальных видах дублеров можно в первоисточнике, а также тут или тут, или на Habr.

Для чего нужны моки

Применение моков может решить несколько проблем:

— атомарность теста и его информативность (при падении теста не придется решать вопросы локализации дефекта, поскольку баг гнездится исключительно в тестируемом объекте, а не в тех системах, которые он использует);

— снижение его хрупкости вследствие зависимости от сторонних систем (внешних, не тестируемых сервисов и БД);

— позволит создавать необходимые тестовые условия, например, ошибки;

— дополнительным положительным эффектом является снижение времени прохождения теста.

Мокирование широко применяется в тестировании. Postman (как и SoapUi) предоставляют возможность создать мок-сервер и воспользоваться благами мокирования при мануальном тестировании бэкенда. Посмотреть можно на русском языке YouTube и здесь YouTube, либо в исходнике здесь Postman Learning Center и здесь SoapUI.

Мокирование в автоматизации тестирования

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

Ниже представлен рейтинг опенсорсных java-mocking проектов:

https://www.libhunt.com/l/java/topic/mocking
https://www.libhunt.com/l/java/topic/mocking

Как видите, выбор есть.

А теперь при помощи комбинации WireMock (№2 в нашем рейтинге), JUnit 5 и Rest-Assured напишем наш «Hello, world!».

Ниже предлагается авторский перевод фрагментов статьи Onur Baskirt (с оригиналом можно ознакомиться здесь), который нам в этом поможет.

В этой статье мы кратко продемонстрируем связки WireMock и JUnit 5. Мы можем создавать моки и стабы как на автономном сервере (standalone), так и без него.

Мы не будем рассматривать решение с автономным WireMock сервером, таким образом, нам не придется создавать его .jar-файл, делать необходимые настройки и активировать их до выполнения теста. Это решение приведено в другой статье — тут.

Мы рассмотрим последовательность шагов для организации работы с моками без запуска автономного сервера.

Шаг 1. Создание проекта и добавление зависимостей

Для начала создадим Maven-проект и назовем его “wiremock-example”:

-3

Мы используем WireMock для создания моков и стабов, Rest-Assured в качестве HTTP-клиента и JUnit 5 в качестве тестового фреймворка. Ниже показана структура нашего проекта:

-4

Как видите, внизу скриншота есть файл glossary.json. В этом файле у нас хранится тело стаба (см.ниже). Путь до файла resources -> __files -> json.

-5

Кстати, можно проверить свой json на сайте http://jsonpath.com/. А мы проверим название файла в качестве значения поля. Его json-path ниже:

-6

Шаг 2. Реализация первого теста и стаба

Во-вторых, мы создадим стаб и выполним тест в коде ниже:

-7

Для начала переименуем WireMock-объект:

-8

Затем запустим mock-сервер на выделенном порте и определить настройки для всех тестов:

-9

Мы должны задать для нашего стаба следующие параметры:

  • мы должны задать endpoint нашего url.
  • мы можем определить content type.
  • определить статус ответа.
  • и связать при помощи метода .withBodyFile с телом запроса из файла “json/glossary.json”, который мы уже приготовили.
-10

В конце каждого теста мы должны остановить мок-сервер:

-11

Шаг 3. Настройка одного эндпоинта c различными условими

Мы добавляем другой пример стаба для двух условий:

  • валидный запрос
  • невалидный запрос
-12

В настройках стаба, как показано выше, мы задаем эндпойнт /some/thing .

Первый стаб вернет ответ с 503 статусом и сообщением “Service Not Available”, если в Header.Content-Type =Accept:text/plain.

Второй стаб вернет ответ с валидным телом и 200 статусом, если Header.Content-Type =Accept:application/json.

Для более реалистичной симуляции мы добавили задержку в 2500 мс.

Оставшаяся часть кода — это тестовые методы Rest-Assured. Больше информации swtestacademy. Ссылка на проект: github.

Вывод

Надеюсь, у вас (как и у меня) по этой подробной инструкции получилось понять, как работают моки и что нужно для их добавления в проект.

С помощью WireMock вы сможете решить некоторые проблемы проекта. Например: конфигурировать систему под нужды автотестов, задать определенные тестовые условия, обеспечить атомарность проверок, ускорить прогон автотестов за счет исключения запуска тяжелых подсистем.

____________________________________________________________________________________

Рекомендуем подписаться на наши соцсети и блог — там мы регулярно публикуем интересные кейсы, новости, анонсы онлайн-мероприятий и вдохновляющие истории успеха:

Telegram: https://t.me/simbirsoft_dev ВКонтакте: https://vk.com/simbirsoft_team Яндекс Дзен: https://zen.yandex.ru/simbirsoft Habr: https://habr.com/ru/company/simbirsoft/blog/ YouTube: https://www.youtube.com/user/SimbirSoft/