Изолированность тестов с внешними сервисами — обязательное условие надёжной автоматизации.
История вопроса: Ранние системы автоматизации "бились" о внешние API и БД, которые часто были либо недоступны, либо возвращали непредвиденные данные. Без изоляции автотестов результат невозможно воспроизвести: флик, падение из-за сторонних проблем, случайные сбои.
Проблема:
Решение:
Использование "моков" и "стабов" — локальных заглушек, симулирующих ответы внешних API. Популярны WireMock (Java), httpmock (Python), MockServer, TestContainers.
Эмуляция БД с помощью in-memory решений или фикстур, очищаемых и заново заполняемых перед каждым тестом.
Вынесение ID тестовых данных в переменные, чтобы тесты могли запускаться параллельно и не "перетаптывать" друг друга.
import requests BASE_URL = "http://localhost:1080/api" def test_order_creation(): mock_response = {"orderId": 12345, "state": "created"} # В реальных тестах ответ возвратит мок-сервер # Здесь вызов requests.post и assert ...
Ключевые особенности:
Обязательно ли проводить интеграционные тесты через реальные сервисы на каждом прогонах?
Нет. Регулярно можно использовать моки/стабы, а интеграционные тесты запускать отдельно, реже и под контролем.
Дадут ли тесты с реальным внешним API всегда более надёжный результат?
Нет. Наоборот, они менее стабильны, могут падать из-за изменений на стороне партнёра. Постоянные флик-тесты ухудшают качество пайплайна.
Можно ли использовать одни и те же тестовые данные для параллельных автотестов с внешними сервисами?
Нет. Это может привести к коллизиям, "гонкам" и нестабильности. Идентификаторы и стейт должны быть уникальными на тест/поток.
В компании решили для скорости запускать все автотесты на реальные сторонние API (платёжный шлюз). Несколько раз тесты забанили, пошли лимиты, приходилось восстанавливать доступ, данные "текли" в реальные отчёты, появлялись ложные срабатывания.
Плюсы:
Минусы:
Настроили MockServer и фиктивную in-memory БД. Перед каждым тестом стейт обнулялся, данные — уникальны. Реальные интеграционные тесты гонялись отдельно и реже.
Плюсы:
Минусы: