Skip to content

🧱 WireMock: Створення імітацій (моків) API для ізольованого тестування

Що це?

WireMock - це інструмент для створення "мок-сервісів" (mock services). Він дозволяє вам імітувати поведінку реальних API, визначаючи, які запити він повинен приймати та які відповіді повертати для цих запитів. Це особливо корисно для ізольованого тестування вашого коду, який залежить від зовнішніх API, коли ці API ще не розроблені, нестабільні, дорогі у використанні під час тестування або їхнє тестування є складним.

Основні можливості та їх детальний огляд:

  • 🎭 Створення стабів (Stubs):

    • Визначення очікуваних запитів: Ви можете точно налаштувати, на які HTTP-метод (GET, POST, PUT, DELETE тощо), URL, заголовки та тіло запиту WireMock повинен реагувати.
    • Визначення відповідних відповідей: Для кожного очікуваного запиту ви можете задати, який HTTP-статус-код, заголовки та тіло відповіді (у будь-якому форматі, наприклад, JSON, XML, текст) повинен повернути WireMock.
    • Гнучкі критерії зіставлення: WireMock надає різні способи зіставлення вхідних запитів з визначеними стабами (наприклад, точна відповідність URL, відповідність за регулярним виразом, перевірка наявності заголовків, відповідність частини тіла запиту).
  • 🚦 Імітація різних сценаріїв:

    • Успішні відповіді: Моделювання очікуваної поведінки API при успішному виконанні запиту.
    • Помилки: Імітація різних типів помилок сервера (наприклад, 400 Bad Request, 500 Internal Server Error) для перевірки обробки помилок у вашому коді.
    • Затримки: Симуляція затримок у відповіді API для тестування тайм-аутів та обробки повільних мережевих з'єднань у вашому коді.
    • Перенаправлення: Імітація HTTP-перенаправлень (301, 302 тощо).
  • ✅ Перевірка запитів:

    • WireMock може записувати всі запити, які надходять до нього.
    • Ви можете використовувати API WireMock для перевірки того, що ваш код надсилав очікувані запити до імітованого API (наприклад, перевірити, який метод використовувався, на який URL надсилався запит, які заголовки та тіло він містив, скільки разів він був викликаний).
  • 🧱 Ізольоване тестування:

    • Використовуючи WireMock, ви можете повністю ізолювати свій код від залежностей від зовнішніх API під час тестування. Це робить тести більш швидкими, надійними та передбачуваними, оскільки вони не залежать від стану зовнішніх сервісів.
    • Це особливо корисно для юніт-тестів та інтеграційних тестів.
  • 🏃 Запуск як окремий процес або вбудована бібліотека:

    • WireMock може бути запущений як окремий HTTP-сервер (standalone), до якого ваш код надсилатиме запити замість реального API.
    • Він також може бути вбудований безпосередньо у ваші тести як бібліотека (наприклад, JUnit rule або TestNG listener у Java), що спрощує налаштування та керування мок-сервісом під час виконання тестів.
  • 📝 Конфігурація через код або JSON:

    • Стаби можуть бути визначені програмно за допомогою API WireMock (наприклад, на Java).
    • Їх також можна визначати декларативно у вигляді JSON-файлів, які WireMock завантажує під час запуску.
  • 🔄 Зміна поведінки моків під час виконання тестів:

    • API WireMock дозволяє динамічно змінювати поведінку імітованих API під час виконання тестів, що дає змогу тестувати різні сценарії.

Приклади використання:

  • Юніт-тестування сервісів, що споживають API: Замість того, щоб робити реальні HTTP-виклики до зовнішнього API, ви налаштовуєте WireMock на повернення заздалегідь визначених відповідей та перевіряєте, чи ваш сервіс правильно обробляє ці відповіді.
  • Інтеграційне тестування: Тестування взаємодії між різними компонентами вашої системи, де один компонент залежить від API іншого. Ви можете використовувати WireMock для імітації поведінки залежного API.
  • Розробка фронтенду без готового бекенду: Фронтенд-розробники можуть використовувати WireMock для створення мок-сервісів, які повертають очікувані дані, що дозволяє їм розробляти інтерфейс до того, як буде готовий реальний бекенд.
  • Тестування обробки помилок та крайніх випадків: Легко імітувати різні сценарії помилок та перевіряти, чи ваш код їх правильно обробляє (наприклад, повторні спроби, повідомлення про помилки).

Візуалізація: Уявіть WireMock як конструктор LEGO для API 🧱. Ви можете створювати власні "фейкові" API з точно визначеною поведінкою для конкретних тестів. Це дозволяє вам контролювати зовнішні залежності та зосередитися на тестуванні логіки вашого власного коду в ізольованому середовищі, роблячи ваші тести більш надійними та передбачуваними.