Интеграционное тестирование
Проверка в БД — SQL для тестировщика, Основы БД, транзакции, PostgreSQL. Карта — о разделе.
Play ITЗагрузка интерактивного демо…
Интеграционное тестирование — это этап проверки программного обеспечения, на котором отдельные компоненты или модули системы объединяются и тестируются вместе для проверки их взаимодействия и корректности передачи данных. Главная цель этого процесса — убедиться, что изолированные части кода правильно работают в связке друг с другом.
Unit проверяет кусочек в изоляции; integration — стык — два модуля, сервис и БД, наш API и чужой. Здесь — простыми словами и пример на pytest; ручная проверка API — в тестировании API.
Интеграционное тестирование
Что такое интеграционный тест?
Интеграционный тест — это конкретный тестовый сценарий (код или последовательность действий), который проверяет совместную работу двух и более компонентов системы. Если интеграционное тестирование — это весь процесс, то интеграционный тест — это его базовая единица. Он фокусируется не на логике одного метода, а на стыках, интерфейсах и передаче данных между частями приложения.
Интеграция - это когда две или больше штуковины (модули, сервисы, системы) начинают между собой общаться.
- модуль А считает налог;
- модуль Б отправляет данные в налоговую;
- интеграция - А передаёт результат Б, а Б его принимает.
А и Б могут по отдельности работать, а вместе нет. Например, данные не приходят, что-то не записывается, или искажается.
Интеграционный тест как раз проверка того, что разговор между компонентами работает правильно. Он отвечает на вопрос "Когда А вызвал Б с такими-то данными, то Б ответил как надо и ничего там не сломалось?".
Например, тест проверяет, что POST /api/orders отправляет заказ в CRM, а CRM возвращает подтверждение. Если подтверждение пришло — тест зелёный.
Здесь мы ловим ошибки:
- формат данных не совпал (один сервис шлёт
user_id, другой ждётuserId); - порядок вызовов нарушен (вызвали
payдоcheckCart); - сервис упал, а второй не умеет обрабатывать ошибки;
- токен протух, а обновлять никто не догадался;
- база вернула
null, а код этого не ждал.
Допустим, А система обладает данными, а Б запрашивает данные из первой. Тогда от владельцев системы А требуется обеспечить возможность передавать данные (выполнять запрос в БД по команде, форматировать и отправлять) и получать запросы. Система Б же должна корректно отправлять запросы в систему А по адресу, и ожидать ответ.
Мини-кейс — как ломается интеграция на практике
Представим сервис заказов и сервис скидок.
Сервис заказов — это ИТ-платформа, которая автоматизирует прием, обработку, отслеживание и выдачу заказов. Сервис скидок — это платформа, которая собирает, проверяет и предоставляет пользователям промокоды, купоны, кешбэк и информацию об акциях магазинов.
Интеграция сервиса скидок и сервиса заказов происходит на уровне программного кода через API (Application Programming Interface). Сервис скидок проверяет условия акции, а сервис заказов пересчитывает итоговую стоимость корзины.
- Сервис заказов отправляет поле
customer_id. - Сервис скидок после обновления ждёт поле
customerId. - Unit-тесты в обоих сервисах остаются зелёными.
- В продакшене скидка не применяется, потому что контракт на стыке уже другой.
Интеграционный тест ловит это до релиза, если в проверках зафиксированы и формат запроса, и бизнес-результат (финальная сумма заказа). Такой контроль особенно важен для цепочек "API + БД + очередь" — см. теорию очередей; рядом держите документацию тестировщика и тестирование API.
Теория очередей (теория массового обслуживания, ТМО) — это математическая дисциплина, которая изучает системы, где возникают задержки из-за дисбаланса между спросом на услугу и возможностями системы по её предоставлению. Простыми словами, она отвечает на вопросы: сколько нужно кассиров, серверов или операторов, чтобы клиенты не уходили из-за долгого ожидания, а бизнес не переплачивал за простой сотрудников.
Разбор кейса — потерянные события в очереди
Потерянные события в очереди (в теории массового обслуживания — системы с отказами или ограниченным накопителем) — это заявки, которые не попали на обслуживание и были безвозвратно утеряны для системы. В ИТ-архитектуре, включая интеграцию сервисов заказов и скидок, это критическая проблема. Она приводит к потере денег, «зависшим» корзинам и сбоям в бизнес-логике.
Почему теряются события?
- Переполнение буфера (Queue Overflow / Drop-tail). Очередь имеет конечный размер (в памяти или на диске). Если новые события приходят быстрее, чем обрабатываются, очередь заполняется до лимита. Все последующие события система просто сбрасывает.
- Истечение времени ожидания (TTL / Timeout). Событие встало в очередь, но пролежало там слишком долго (истек его Time To Live). Например, пользователь уже закрыл вкладку со скидкой, и обрабатывать этот запрос больше нет смысла — событие удаляется.
- Сбои инфраструктуры (Unacknowledged drops). Сервер, на котором хранилась очередь (например, RabbitMQ или Kafka), экстренно перезагрузился, а данные хранились только в оперативной памяти (RAM) без сохранения на диск (Persistence).
- Ошибки обработки (Poison Pill). Событие содержит некорректные данные. Сервер пытается его обработать, «спотыкается», падает, а после перезапуска снова берет это же битое событие. Возникает бесконечный цикл, из-за которого вся очередь встает, а новые события начинают теряться.
Ситуация типична для at-most-once без outbox — см. гарантии доставки и идемпотентность.
Ситуация:
- После оформления заказа сервис отправлял событие в очередь для склада.
- UI показывал "Заказ принят", но часть заказов не доходила до обработки.
- Unit-тесты сервиса создания заказа оставались зелёными.
Диагностика:
- Интеграционный тест проверил полный путь:
POST /orders-> запись в БД -> публикация события -> чтение события consumer-сервисом. - Выяснилось, что при временном таймауте брокера событие терялось без повторной отправки.
Что исправили:
- Добавили retry-политику с ограниченным числом попыток.
- Ввели outbox-таблицу для гарантированной доставки событий.
- Расширили интеграционные проверки на негативный сценарий "брокер недоступен".
Результат:
- Потери заказов прекратились.
- Команда получила воспроизводимый тест на критичный бизнес-риск.
Вывод:
Интеграционные тесты особенно ценны там, где есть "стыки" между сервисами и инфраструктурой. Для контроля устойчивости на нагрузке этот же кейс полезно дополнять нагрузочными сценариями.
Мини-пример — POST заказа и проверка ответа (pytest + httpx)
При интеграции сервиса заказов и сервиса скидок отправка POST-запроса на создание заказа и валидация ответа — это самый критический этап. Системы должны работать синхронно, чтобы не допустить применения фальшивых скидок или потери заказа.
Учебный API без браузера — только "сервис A вызвал контракт и получил ожидаемый ответ":
Код ITЗагрузка примера кода…
В "боевом" интеграционном тесте после Act часто добавляют проверку второй системы — запись в БД, сообщение в очереди, вызов mock внешнего платежа. Тогда оракул — не только JSON ответа, но и состояние стенда (SQL, логи, второй GET).
Смысл, цели и место в системе обеспечения качества
Интеграционное тестирование — это этап обеспечения качества (QA), на котором отдельные модули, микросервисы или системы (например, сервис заказов и сервис скидок) объединяются и тестируются как единое целое. Его главное отличие от других видов тестирования заключается в фокусе, ведь проверяется не внутренняя логика конкретного компонента, а правильность их взаимодействия и обмена данными. Сервис заказов правильно формирует JSON, а Сервис скидок правильно считает математику. Но если при интеграции выясняется, что один передает дату в формате Timestamp (1719878400), а второй ожидает ISO 8601 ("2026-07-02"), система сломается. Интеграционные тесты находят такие баги до того, как они попадут к пользователям.
Интеграционное тестирование представляет собой этап верификации программного обеспечения, на котором проверяется корректность взаимодействия отдельных компонентов системы после их соединения в единую логическую или физическую структуру. Если юнит-тестирование отвечает за валидацию отдельных модулей в изоляции, а системное тестирование — за проверку целого приложения в целевой среде, то интеграционное тестирование занимает промежуточную, но критически важную позицию — оно фокусируется на границах модулей, интерфейсах передачи данных, соглашениях о взаимодействии и семантике обмена.
Задача — выявить дефекты, которые принципиально невозможны при тестировании компонентов по отдельности. Такие дефекты часто связаны с несогласованностью контрактов (например, ожидаемый формат даты в одном модуле — ISO 8601, а в другом — dd.MM.yyyy), неявными зависимостями (например, модуль A полагается на побочный эффект выполнения модуля B, не зафиксированный в спецификации), нарушениями порядка вызовов или утечками состояния между интеграционными точками.
Типичные классы ошибок, обнаруживаемых на этом уровне:
- Несоответствие формата данных между отправителем и получателем (например, JSON-структура содержит поле
userId, а потребитель ожидаетuser_id); - Нарушение последовательности вызовов (например, вызов метода
finalizeOrder()без предварительногоvalidateCart()); - Проблемы с сериализацией/десериализацией (например,
nullв числовом поле при отсутствии обработки в десериализаторе); - Некорректная обработка временных зависимостей (например, race condition при одновременном обращении к разделяемому ресурсу);
- Отсутствие или неправильная реализация механизмов восстановления при сбое (retry, circuit breaker, fallback);
- Несоблюдение соглашений по HTTP (например, возврат статуса
200 OKпри фактической бизнес-ошибке вместо4xx/5xx).
Интеграционное тестирование применяется как к внутренним связям (между сервисами в микросервисной архитектуре, между слоями в monolith, между классами в рамках одного модуля), так и к внешним — при взаимодействии с third-party API, базами данных, message broker’ами, legacy-системами и прочими внешними зависимостями. Именно здесь проявляется ключевая особенность интеграционных проверок — они требуют фактического выполнения кода в смонтированной конфигурации, пусть даже частичной и с подменой некоторых компонентов (stubs, mocks, test doubles — Объекты и уровни тестирования, 4.09 Зависимости).
Подходы к организации интеграционного тестирования
Существует несколько стратегий построения интеграционных проверок, различающихся по направлению "сборки" системы и уровню изоляции:
Пошаговая (incremental) интеграция
Пошаговая (инкрементальная) интеграция — это подход к сборке и тестированию системы, при котором компоненты, модули или микросервисы объединяются и тестируются не все сразу, а поочередно, один за другим. Этот метод противопоставлен подходу «Большого взрыва» (Big Bang), когда разработчики пытаются соединить все готовые части системы в последний день перед релизом, что неизбежно приводит к хаосу и долгим поискам причин ошибок.
Если соединить сразу 10 микросервисов и система упадет, придется проверять логи, контракты и базы данных всех 10 сервисов. При пошаговой интеграции вы берете один стабильно работающий сервис, добавляете к нему только один новый компонент и сразу проводите тестирование. Если система ломается, вы на 100% уверены: баг кроется либо в новом компоненте, либо в интерфейсе его связи со старым.
Компоненты подключаются по одному к уже протестированному ядру, и на каждом шаге выполняется проверка новых интерфейсов. Это позволяет быстро локализовать источник сбоя — он почти наверняка связан с последним подключённым модулем. Варианты:
- Снизу вверх — сначала тестируются низкоуровневые модули (например, DAL, утилиты), затем к ним добавляются более высокоуровневые (бизнес-логика, контроллеры). Преимущество — раннее выявление проблем в фундаментальных слоях. Недостаток — отсутствие "видимого" результата до завершения сборки верхних уровней.
- Сверху вниз — начинается с высокоуровневых модулей (например, API-контроллеров), при этом нижележащие компоненты заменяются заглушками. Позволяет быстро протестировать end-to-end сценарии, но требует значительных усилий на создание и поддержку заглушек, а также рискует пропустить ошибки в "нижних" слоях до их реальной интеграции.
Основные стратегии пошаговой интеграции:
- Нисходящая интеграция (Top-Down). Интеграция начинается с самых верхних, главных управляющих модулей (например, графического интерфейса пользователя или центрального оркестратора заказов). Низкоуровневые сервисы еще могут быть не написаны — их заменяют «заглушками» (Stubs/Mocks).
- Восходящая интеграция (Bottom-Up). Процесс идет снизу вверх. Сначала тестируются базовые, низкоуровневые сервисы, которые ни от кого не зависят (например, модуль валидации промокодов или база данных). Так как верхние модули (бизнес-логика) еще не готовы, для запуска тестов пишутся специальные «драйверы» (Drivers) — скрипты, имитирующие вызовы сверху.
- Сандвич-интеграция (Комбинированная). Сочетает оба подхода. Систему мысленно делят на три слоя: верхний (UI/Оркестратор), средний (Бизнес-логика) и нижний (Инфраструктура/Базы данных). Интеграция идет одновременно сверху вниз и снизу вверх к среднему слою. Это идеальный вариант для крупных распределенных команд.
Big Bang интеграция
Интеграция «Большого взрыва» (Big Bang Integration) — это подход к сборке системы, при котором все модули, компоненты или микросервисы объединяются одновременно в один день, после чего система тестируется целиком. Этот метод противопоставлен пошаговой (инкрементальной) интеграции. Его часто описывают фразой: «Давайте сначала всё напишем, а потом включим и посмотрим, что произойдет».
Представим разработку маркетплейса. Три независимые команды параллельно пишут:
- Сервис авторизации
- Сервис заказов
- Сервис скидок
При подходе Big Bang эти сервисы вообще не общаются друг с другом во время разработки. Каждый программист проверяет свой код локально «на коленке». В назначенный день дедлайна (например, в конце двухмесячного релиза) администратор деплоит все три сервиса на общий тестовый контур, связывает их конфигурационными файлами и запускает сквозной тест.
Все компоненты интегрируются одновременно, после чего запускается полный цикл проверок. Этот подход экономит время на подготовку промежуточных конфигураций, но резко усложняет диагностику: при провале сценария невозможно быстро определить, какой именно из десятка новых интерфейсов содержит дефект. Big Bang применяется редко и, как правило, только в проектах с очень простой архитектурой или при отсутствии возможности поэтапной сборки.
Sandboxing и интеграционные окружения
Sandboxing (песочница) и интеграционное окружение (Integration/Staging Environment) — это два разных типа изолированных сред, которые используются на стыке разработки и тестирования для безопасной проверки кода. Главное отличие между ними: песочница изолирует внешние системы или опасный код от основной системы, а интеграционное окружение объединяет все внутренние сервисы вместе для проверки их совместной работы.
Песочница — это изолированная среда, которая имитирует поведение реальной системы, но полностью безопасна для экспериментов и не имеет доступа к боевым данным (Production). Чаще всего песочницу предоставляют сторонние сервисы (банки, платежные шлюзы, службы доставки), чтобы ваши сервисы заказов и скидок могли протестировать интеграцию с ними, не тратя реальные деньги и не отправляя настоящих курьеров. Пример - вы интегрируете оплату заказов через СБП или Stripe. Банк дает вам Sandbox API URL и номера тестовых карт. Вы можете отправлять туда POST-запросы, имитировать успешные оплаты или отказы из-за нехватки денег. При этом списания реальных средств не происходит.
Интеграционное окружение — это специальный выделенный контур (набор серверов или кластер Kubernetes), где развернуты актуальные версии всех внутренних микросервисов вашей компании. Это точная копия боевого сервера (Production), но уменьшенного масштаба и заполнена тестовыми данными. Здесь проводится интеграционное тестирование, инкрементальная сборка или тесты методом «Большого взрыва». В этой среде проверяется, как ваши собственные сервисы общаются друг с другом. Пример - в интеграционном окружении одновременно запущены Сервис заказов (v2.1), Сервис скидок (v1.8) и Сервис уведомлений (v3.0). Разработчик отправляет запрос на создание заказа и смотрит, как это событие проходит по всей цепочке внутри компании, не боясь сломать что-то у реальных клиентов.
Для выполнения интеграционных тестов необходима специализированная среда, воспроизводящая реальные условия взаимодействия, но при этом изолированная от production и dev. Такая среда обычно включает:
- Test-версии зависимых сервисов (часто в виде контейнеров Docker);
- Эмуляторы внешних API (например, WireMock, Mountebank);
- "Чистые" инстансы СУБД с предзаполненными тестовыми данными;
- Message broker в режиме тестирования (например, embedded Kafka или RabbitMQ в Docker);
- Сетевые ограничения (latency, packet loss), если это критично для сценариев.
Интеграционные тесты не должны полагаться на состояние production-систем. Их запуск должен быть идемпотентным — многократный запуск одного и того же сценария не должен приводить к накоплению побочных эффектов (например, дублированию записей в БД без отката транзакции).
Интеграционное тестирование API
Интеграционное тестирование API — это процесс проверки взаимодействия между несколькими независимыми сервисами (или сервисом и базой данных) через программные интерфейсы. В отличие от модульных тестов, здесь проверяются реальные сетевые запросы, соблюдение API-контрактов (схем данных), корректность HTTP-статусов и сквозная бизнес-логика.
В условиях доминирования распределённых систем (REST, gRPC, GraphQL, message-driven) подавляющее большинство интеграционных проверок сводится к тестированию сетевых интерфейсов. API становится контрактом, определяющим синтаксис обмена и семантику поведения. Поэтому интеграционное тестирование API — это комплексная проверка:
Соответствие контракту
Соответствие контракту (Contract Compliance / Contract Testing) в интеграционном тестировании API — это проверка того, что структура, форматы данных и поведение отправляемых запросов и получаемых ответов строго соответствуют заранее утвержденной спецификации (контракту). В микросервисной архитектуре контракт — это «юридическое соглашение» между Провайдером (сервис, который предоставляет API, например, Сервис скидок) и Потребителем (сервис, который вызывает это API, например, Сервис заказов).
Если разработчик Сервиса скидок изменит контракт без предупреждения (например, переименует поле discount_amount в discount), Сервис заказов при интеграции не сможет прочитать ответ, сломается с ошибкой и клиенты не смогут оформить заказ. Тестирование на соответствие контракту гарантирует, что изменения в коде одного сервиса не «аффектят» (не ломают) зависимые сервисы.
Под контрактом понимается формальное или неформальное описание ожидаемого поведения интерфейса. Это может быть:
- OpenAPI/Swagger-спецификация;
- Protobuf-файл для gRPC;
- GraphQL schema;
- Соглашения внутри команды (например, "все ошибки возвращаются в теле JSON с полем
error.code").
Проверка контракта включает:
- Корректность HTTP-метода (GET не должен изменять состояние, POST — создавать ресурс и т.д.);
- Соответствие формата запроса (поля, типы, обязательность, ограничения);
- Корректность структуры ответа (включая вложенные объекты, массивы, ссылки);
- Валидность HTTP-статусов (201 Created при создании ресурса, 404 Not Found при отсутствии, 409 Conflict при конфликте идемпотентности);
- Обязательные и опциональные заголовки (например,
ETag,Last-Modified,Content-Type,Retry-After); - Поддержка версионирования (через заголовок
Accept, параметр URL или path-префикс).
Нарушение контракта — фатальный дефект. Даже если бизнес-логика работает корректно, несоответствие спецификации делает API непригодным для интеграции.
Семантическая корректность бизнес-логики
Семантическая корректность бизнес-логики — это уровень интеграционного тестирования, который проверяет не просто техническую работоспособность API (структуру JSON, HTTP-статусы, заголовки), а правильность смысла, контекста и математики передаваемых данных с точки зрения реальных бизнес-правил компании. Если соответствие контракту (синтаксис) отвечает на вопрос: «Правильно ли упакованы данные?», то семантическая корректность (семантика) отвечает на вопрос: «Имеют ли эти данные смысл и не нарушают ли они законы бизнеса?».
Семантическая корректность проверяется на самых поздних этапах интеграционного тестирования и плавно переходит в системное (E2E) тестирование. Без предварительной проверки контрактов тестировать семантику невозможно: если сервисы не могут договориться о формате полей, они просто не смогут передать друг другу данные для проверки бизнес-логики.
Контракт определяет как, но не что. Здесь проверяется, соответствует ли поведение API предметной области:
- При создании заказа проверяется, что общая сумма рассчитана верно с учётом скидок и налогов;
- При запросе истории операций возвращаются только записи, относящиеся к указанному пользователю;
- Изменение статуса задачи возможно только в рамках допустимых переходов (например,
draft → active, но неdraft → archived); - Повторный вызов идемпотентного запроса (
PUT /orders/{id}) не приводит к дублированию данных.
Такие проверки невозможно выполнить на уровне юнит-тестов одного контроллера — они требуют смонтированной цепочки: контроллер → сервис → репозиторий → БД → (возможно) внешний сервис.
Обработка ошибок и граничных условий
Обработка ошибок и граничных условий — это критически важный слой интеграционного тестирования. Его цель — проверить, как связка сервисов (например, заказов и скидок) реагирует на нестандартные ситуации, экстремальные значения данных и сбои инфраструктуры. Главное правило интеграции: система должна падать «грациозно» (Graceful Degradation). Если один сервис ломается или присылает некорректные данные, второй не должен «умирать» вслед за ним или переходить в неопределенное состояние.
Интеграционные тесты должны охватывать сценарии отказа:
- Передача некорректных данных (отрицательная сумма, строка вместо числа, слишком длинное поле);
- Обращение к несуществующему ресурсу (неверный ID);
- Попытка выполнить запрещённую операцию (удалить несвой заказ);
- Превышение лимитов (rate limiting, размер payload);
- Таймауты и отказы внешних зависимостей (например, падение payment gateway);
- Параллельные запросы на один и тот же ресурс (конкурентное обновление).
Особое внимание уделяется предсказуемости поведения при ошибках — ответ должен быть понятен потребителю, не раскрывать внутренние детали реализации (никаких stack trace в теле ответа), и желательно — содержать код ошибки, по которому можно построить логику восстановления.
Производительность и устойчивость
Производительность и устойчивость — это нефункциональные характеристики интеграции, которые показывают, способна ли связка сервисов (заказов и скидок) держать высокую нагрузку и сохранять работоспособность при пиковых запросах или отказах оборудования. Проверка этих параметров происходит в рамках нагрузочного тестирования (Performance Testing) и тестирования на надежность (Stability/Resilience Testing).
Хотя нагрузочное тестирование — отдельная дисциплина, базовые проверки производительности часто встраиваются в интеграционные сценарии:
- Время ответа на типичный запрос не превышает SLA (например, < 500 мс для 95-го перцентиля);
- Система корректно обрабатывает пакетные запросы (bulk operations; см. Пакетная работа с данными);
- Наблюдается стабильность под длительной нагрузкой (отсутствие утечек памяти, роста latency со временем);
- Реализованы механизмы graceful degradation (например, при падении кэша запрос уходит в БД, но медленнее, а не завершается ошибкой).
Эти проверки особенно важны, когда интеграция происходит между системами с разными SLA — например, high-load frontend и legacy backend с высокой latency.
Инструментарий интеграционного тестирования
Инструменты для интеграционного тестирования подбираются в зависимости от того, на каком уровне происходит взаимодействие систем: проверяются ли прямые вызовы API (синхронно), обмен сообщениями через очереди (асинхронно) или совместная работа компонентов с базами данных.
Выбор инструмента для интеграционного тестирования определяется техническими возможностями и контекстом его применения — стадией жизненного цикла, уровнем автоматизации, требованиями к воспроизводимости, интеграцией с CI/CD, а также компетенциями команды. На практике редко используется единственный инструмент — чаще формируется стек, где каждый компонент решает свою специфическую задачу.
Условно инструменты можно разделить на три категории, хотя границы между ними размыты.
Интерактивные инструменты
Интерактивные инструменты интеграционного тестирования — это программное обеспечение с графическим интерфейсом (GUI), которое позволяет инженерам, разработчикам и QA-специалистам визуально проектировать, отправлять запросы, отслеживать потоки данных и анализировать взаимодействие систем в реальном времени. Они минимизируют написание кода «с нуля» и предоставляют визуальную среду для симуляции различных сценариев (включая работу сервисов заказов и скидок).
Эти инструменты предназначены в первую очередь для человека — разработчика, тестировщика, аналитика — того, кто проектирует, реализует или проверяет API в процессе работы. Их ключевые качества — наглядность, скорость настройки, поддержка отладки в реальном времени и удобство документирования.
Основные функции:
- Конструирование HTTP-запросов с визуальным редактором параметров, заголовков, тела;
- Сохранение и группировка запросов (коллекции, папки);
- Управление окружениями (dev/stage/prod с разными базовыми URL, токенами, параметрами);
- Просмотр структурированного ответа (JSON, XML, HTML) с подсветкой синтаксиса и возможностью фильтрации;
- Встроенная документация (генерация из коллекции);
- Простые проверки (статус-код, наличие поля в ответе) — часто через GUI.
Недостатки: ограниченная выразительность логики, сложность поддержки сложных сценариев (цепочки запросов с передачей данных между ними), отсутствие контроля версий "из коробки". Однако именно эти инструменты незаменимы на ранних этапах — при проектировании API (Проектирование-first подход), при отладке интеграции "здесь и сейчас", при онбординге новых участников.
Postman — безусловный лидер в этой категории, и далее мы подробно рассмотрим его архитектуру и применение.
Фреймворки для автоматизированного тестирования
Фреймворки для автоматизированного тестирования — это кодовые базы и библиотеки, которые позволяют инженерам полностью автоматизировать интеграционные проверки, отказаться от ручного интерфейса и встроить тесты в процесс непрерывной интеграции (CI/CD). В отличие от интерактивных инструментов (вроде Postman), фреймворки дают полную свободу программирования, высокую скорость выполнения и возможность тонко настраивать тестовое окружение.
Эта группа инструментов ориентирована на машины — их задача — обеспечить стабильный, повторяемый, контролируемый запуск тестов как части сборки и доставки. Они требуют написания кода (часто на том же языке, что и основное приложение), но дают полный контроль над логикой, состояниею, отчётностью и интеграцией.
Характерные черты:
- Тесты пишутся как часть кодовой базы (обычно в отдельной директории
test/integration); - Используются стандартные механизмы сборки и запуска (JUnit, pytest, Jest и т.д.);
- Поддерживают работу с моками и стабами (Testcontainers, WireMock, embedded databases);
- Интегрируются в отчётность (Allure, JaCoCo, Cobertura);
- Выполняются в CI/CD-пайплайне (GitHub Actions, GitLab CI, Jenkins) — как отдельный stage или в составе end-to-end проверок.
Преимущества — типобезопасность (если язык статически типизирован), рефакторингопригодность, возможность выразительной параметризации и повторного использования кода, глубокая интеграция с инструментами разработки. Недостаток — более высокий порог входа и необходимость поддержки кода тестов.
Python — самый популярный язык для автоматизации благодаря лаконичному синтаксису и мощной экосистеме. Если бэкенд системы написан на Java/Kotlin, тесты чаще всего пишут на этом же стеке. JavaScript / TypeScript подходят, если команда разработки пишет и фронтенд, и бэкенд (Node.js) на одном языке.
RestAssured (Java), Supertest (Node.js), Karate DSL, pytest + requests + pytest-bdd (Python) — яркие представители этого класса.
Пишите автотесты на том же языке, на котором написаны ваши сервисы заказов и скидок. Это позволит разработчикам легко читать тесты, а QA-инженерам — использовать готовые структуры данных (модели) из основного кода. Если нужно быстро покрыть API и проверять контракты — берите PyTest + Requests или REST Assured. Если впереди много работы со сторонними банками и базами данных — обязательно подключайте фреймворк Testcontainers в связке с основным движком.
Гибридные решения
Гибридные решения в интеграционном тестировании — это подход, который объединяет возможности интерактивных no-code/low-code инструментов (для наглядности и быстрой отладки) и классических фреймворков автоматизации (для масштабирования и встраивания в CI/CD). Они устраняют главный недостаток чистого кода (сложный порог входа) и главный минус визуальных программ (тяжело поддерживать тысячи тестов в GUI).
Эти инструменты пытаются совместить простоту описания (часто в виде конфигурационных файлов или DSL) с возможностями продвинутого автоматизированного тестирования — нагрузки, безопасности, анализа покрытия. Они часто используют YAML/JSON/Gherkin в качестве основного языка описания, но допускают встраивание произвольного кода при необходимости.
Тесты описываются декларативно ("что нужно проверить"), а не императивно ("как это сделать"). Это упрощает поддержку и позволяет вовлекать в написание тестов аналитиков или QA-инженеров с ограниченными навыками программирования.
Karate и Pact (для контрактного тестирования) — примеры гибридных подходов. SoapUI Pro и ReadyAPI также относятся к этой категории, добавляя GUI-редактор к декларативному ядру.
Контрактное тестирование (contract testing) — отдельный слой для микросервисов — потребитель API и поставщик заранее согласуют формат запроса/ответа, тесты проверяют, что обе стороны его соблюдают, даже если сервисы развёрнуты по отдельности. Это ловит рассинхрон вроде userId vs user_id раньше, чем упадёт E2E. Инструменты: Pact, Spring Cloud Contract. Это дополнение при частых изменениях API.
Если в вашей команде мало автоматизаторов, а интеграцию сервисов заказов и скидок нужно покрыть тестами быстро — выбирайте гибрид Postman + Newman или Bruno. Если у вас сложная бизнес-логика (семантика) и много микросервисов — лучше использовать чистые фреймворки (PyTest / REST Assured), но подключить к ним интерактивные отчеты (Allure) и визуальные панели для мониторинга (Grafana).
Postman
Postman — это самый популярный гибридный инструмент для работы с API, который объединяет визуальный интерфейс для ручной отладки и мощный функционал для автоматизации интеграционных тестов.
Postman изначально представлял собой расширение для Chrome — простой инструмент для отправки HTTP-запросов. Со временем он трансформировался в облачную платформу (Postman API Platform), охватывающую весь жизненный цикл API — проектирование, разработка, тестирование, документирование, мониторинг. Однако его ядро — коллекции и скриптовые хуки — остаётся неизменным и крайне полезным для интеграционного тестирования.
Postman перестал бы быть гибридным решением, если бы требовал постоянно нажимать кнопку «Send» руками. Для автоматизации используется консольная утилита Newman. Newman прогонит все запросы по цепочке в консоли сервера, проверит JS-ассерты и сгенерирует детальный HTML-отчет со всеми упавшими интеграционными тестами.
Архитектурные компоненты Postman, релевантные тестированию
Архитектура Postman спроектирована как модульная среда управления жизненным циклом API. Для задач интеграционного тестирования ключевыми являются компоненты, отвечающие за изоляцию данных, автоматизацию сценариев, симуляцию сред и исполнение кода.
Коллекции и папки
Коллекция — это именованная группа запросов, объединённых по смыслу (например, "Auth API", "Orders API"). Внутри коллекции запросы могут быть упорядочены и размещены в папках. Коллекции экспортируются в JSON, что позволяет хранить их в системе контроля версий (хотя нативная поддержка merge-конфликтов в GUI ограничена).
В Postman действует строгая древовидная иерархия. Папки позволяют дробить сложный процесс интеграции на изолированные шаги.
Переменные окружения и глобальные переменные
Переменные окружения (Environment Variables) и Глобальные переменные (Global Variables) — это архитектурные компоненты Postman, отвечающие за параметризацию запросов и изоляцию тестовых сред. Они позволяют отделить сами тесты (логику запросов к сервисам заказов и скидок) от конфигурационных данных (URL-адресов, токенов, ключей), делая тестовые сценарии переносимыми и гибкими. Главное различие между ними заключается в границах их доступности внутри экосистемы Postman.
Postman поддерживает несколько уровней переменных:
- Environment — набор переменных, привязанных к окружению (например,
base_url = https://api.dev.example.com,auth_token = abc123). Переключение окружений — один клик. - Collection variables — общие для всей коллекции (например,
api_version = v1); - Global variables — доступны во всех коллекциях (рекомендуется использовать редко);
- Local variables (в скриптах) — временные, живут в рамках одного запроса.
Переменные используются в любом поле запроса через синтаксис {{variable_name}}.
Глобальные переменные (Globals) имеют самую широкую область видимости. Они доступны во всех коллекциях, папках и запросах внутри вашего рабочего пространства (Workspace), независимо от того, какой контур сейчас выбран.
Переменные окружения (Environments) привязаны к конкретному контексту или серверному контуру. Вы создаете отдельный набор (контейнер) переменных для каждой среды (например, Local, Development, Staging, Production). Одновременно активным может быть только одно окружение.
Pre-request Script и Tests
Pre-request Script и Tests (Post-response) — это два фундаментальных хука (этапа) жизненного цикла запроса в Postman. Они позволяют внедрять JavaScript-код в процесс тестирования, автоматизируя подготовку данных перед отправкой запроса и проверку результатов после его завершения. В интеграции сервисов заказов и скидок эти скрипты отвечают за динамическую генерацию параметров (синтаксис) и проверку бизнес-логики (семантику).
Вся работа в скриптах строится вокруг глобального объекта pm (Postman). Он предоставляет API для доступа к контексту запроса, ответа, переменным и встроенным библиотекам тестирования.
Это два JavaScript-хука, выполняемых до отправки запроса и после получения ответа соответственно. Выполняются в изолированном окружении на базе Node.js (но без доступа к require, fs, process — только встроенные утилиты Postman — pm, atob, btoa, JSON, CryptoJS и др.).
-
Pre-request Script используется для:
- Генерации динамических данных (timestamp, UUID, хэши);
- Получения токенов авторизации (например, вызов
/auth/loginи сохранениеaccess_tokenв переменную); - Подготовки тела запроса (например, подпись запроса по алгоритму HMAC-SHA256).
-
Tests — для валидации ответа:
- Проверка HTTP-статуса:
pm.response.to.have.status(200); - Проверка заголовков:
pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json'); - Извлечение данных из ответа (JSON, XML) и сохранение в переменные для последующих запросов:
- Проверка HTTP-статуса:
const jsonData = pm.response.json();
pm.globals.set('orderId', jsonData.id);
- Сложные утверждения — проверка схемы JSON через
tv4, сравнение значений, валидация форматов.
Библиотека pm (Postman API) предоставляет fluent-интерфейс для написания читаемых проверок.
Newman — CLI-движок для автоматизации
Newman — это утилита командной строки, позволяющая запускать коллекции Postman вне GUI. Это ключевой компонент для интеграции в CI/CD. Это официальный CLI (Command Line Interface) движок для Postman. Он позволяет запускать созданные в графическом интерфейсе коллекции тестов напрямую из консоли. Newman полностью переносит встроенную в Postman JavaScript-песочницу (Pre-request и Tests скрипты) на уровень сервера, превращая интерактивные тесты в полноценный элемент автоматизации:
newman run TasksAPI.postman_collection.json \
--environment dev.postman_environment.json \
--reporters cli,html \
--reporter-html-export report.html
Newman поддерживает:
- Параметризацию через CLI-аргументы;
- Генерацию отчётов (HTML, JSON, JUnit XML);
- Выполнение в Docker-контейнере;
- Работу с Newman-специфичными опциями (timeout, delay, iteration Данные).
Таким образом, Postman позволяет реализовать гибридный подход: тесты разрабатываются и отлаживаются в удобном GUI, затем автоматизируются через Newman и встраиваются в пайплайн. Это особенно ценно на ранних этапах (shift-left), когда контракт API ещё не стабилен, и изменения происходят часто — правка в GUI быстрее, чем рефакторинг кода в RestAssured.
Интеграционное тестирование REST API управления задачами
Рассмотрим реалистичный сценарий — разрабатывается сервис Задачи API — простой CRUD для задач (task) с полями id, title, description, status (pending, in_progress, done), createdAt, updatedAt.
Шаг 1. Проектирование контракта (вне Postman, но влияет на тесты)
Согласуем минимальный контракт:
GET /Задачи— список задач (пагинация не требуется);GET /Задачи/:id— получение задачи по ID;POST /Задачи— создание задачи (требуютсяtitle,description;statusпо умолчаниюpending);PUT /Задачи/:id— полное обновление задачи;PATCH /Задачи/:id— частичное обновление (только переданные поля);- удаление.
DELETE /Задачи/:id
Ожидаемые статусы:
- Успех —
200 OK(GET, PUT, PATCH),201 Created(POST),204 No Content(DELETE); - Ошибки —
400 Bad Request(некорректные данные),404 Not Found(ресурс не существует),405 Method Not Allowed(неподдерживаемый метод),422 Unprocessable Entity(семантическая ошибка, например, обновление несуществующего поляstatusнаinvalid_value).
Шаг 2. Создание коллекции в Postman
- Создаём коллекцию
Задачи API. - Добавляем папку
Setupс запросомGET Healthcheck→GET {{base_url}}/healthдля проверки доступности сервиса. - Добавляем папку
CRUDс запросами:- (POST)
Create Task
Get All Задачи(GET)Get Task by ID(GET)
Update Task (PUT)
Partial Update (PATCH)- (DELETE)
Delete Task
Шаг 3. Настройка окружения
Создаём окружение Local:
base_url = http://localhost:3000/apitest_task_id =(оставляем пустым — будет заполнен динамически)
Шаг 4. Написание тестов
Запрос — Create Task
Тело запроса (raw, JSON):
{
"title": "Изучить интеграционное тестирование",
"description": "Написать главу для Вселенной IT"
}
Tests:
Код ITЗагрузка примера кода…
Запрос — Get Task by ID
URL: {{base_url}}/Задачи/{{created_task_id}}
Tests:
Код ITЗагрузка примера кода…
Запрос — Partial Update (PATCH)
Тело:
{
"status": "in_progress"
}
Tests:
Код ITЗагрузка примера кода…
Запрос — Delete Task
Tests:
Код ITЗагрузка примера кода…
Тесты на ошибки (отдельные запросы в папке Error Handling)
POST /Задачис пустымtitle→ ожидаем400и тело с описанием ошибки;GET /Задачи/invalid-id→404;PATCH /Задачи/{{valid_id}}с{"status": "unknown"}→422.
Для каждого — аналогичные проверки в Tests.
Шаг 5. Автоматизация через Newman
После локальной отладки коллекцию сохраняют в репозиторий (например, tests/postman/TasksAPI.postman_collection.json), окружение — tests/postman/env/local.json.
В .gitlab-ci.yml (или аналоге):
integration-tests:
stage: test
image: postman/newman:alpine
script:
- newman run tests/postman/TasksAPI.postman_collection.json
--environment tests/postman/env/local.json
--reporters cli,junit
--reporter-junit-export report.xml
artifacts:
reports:
junit: report.xml
Теперь каждый коммит, затрагивающий API, будет проходить интеграционную проверку. При неудаче — сборка падает, и разработчик сразу видит, какой контракт нарушен.
Фреймворки для автоматизированного интеграционного тестирования
В отличие от интерактивных инструментов, фреймворки для автоматизированного тестирования интегрируются непосредственно в кодовую базу и жизненный цикл сборки. Их преимущества проявляются при необходимости поддержки сложных сценариев, обеспечения воспроизводимости и масштабируемости тестового набора.
RestAssured (Java)
RestAssured — это специализированный Java-фреймворк с открытым исходным кодом, предназначенный для автоматизации тестирования REST-сервисов. В отличие от гибридного Postman, RestAssured предоставляет полноценный подход «тестирование как код» (Test-as-Code). Он использует предметно-ориентированный язык (DSL) в стиле Given-When-Then (Дано — Когда — Тогда), что делает интеграционные тесты легко читаемыми и лаконичными
RestAssured не является standalone-фреймворком — это библиотека, построенная поверх стандартных HTTP-клиентов (по умолчанию — Apache HttpClient или OkHttp). Её главная идея — позволить писать интеграционные тесты на Java так, будто язык изначально поддерживает HTTP-верификацию.
Архитектурные особенности
- Fluent DSL: цепочки вызовов читаются как спецификация:
given()
.header("Authorization", "Bearer " + token)
.body(newTask)
.when()
.post("/Задачи")
.then()
.statusCode(201)
.header("Location", matchesPattern("/Задачи/\\d+"))
.body("title", equalTo("Новая задача"))
.body("status", equalTo("pending"))
.extract().path("id");
- Валидация JSON/XML — поддержка JsonPath и XPath "из коробки", встроенные матчеры Hamcrest, возможность подключения JSON Schema Validator.
- Подготовка состояния — лёгкая интеграция с Testcontainers для поднятия реальной (но изолированной) СУБД, Redis, Kafka перед запуском тестов.
- Извлечение данных: методы
.extract().response(),.extract().path("id")позволяют сохранять значения между запросами без ручного парсинга.
Почему RestAssured — хороший выбор для интеграционного тестирования в Java-мире?
- Тесты хранятся в том же репозитории, что и продукционный код — рефакторинг API (например, изменение пути эндпоинта) сразу ломает тесты, что сигнализирует о рассогласовании.
- Полная типобезопасность при работе с DTO (если использовать
ObjectMapperдля десериализации тела ответа). - Поддержка всех этапов пайплайна — локальная отладка в IDE, запуск через Maven/Gradle, интеграция в JaCoCo для анализа покрытия интеграционных сценариев (не путать с unit-покрытием).
- Возможность параметризации через JUnit 5 (
@ParameterizedTest,@CsvSource).
Ограничения
- Зависимость от JVM-стека (не подходит для polyglot-проектов);
- Сложность работы с асинхронными интерфейсами (например, SSE, WebSockets) без дополнительных обёрток;
- Не предназначен для нагрузочного тестирования — только функциональная проверка.
Supertest (Node.js)
Supertest — это популярная Node.js-библиотека, предназначенная для тестирования HTTP-серверов. Чаще всего её используют для интеграционного тестирования приложений, написанных на Express, Koa или Fastify. В отличие от RestAssured или Postman, которые всегда отправляют запросы через реальную внешнюю сеть, Supertest умеет работать в двух режимах. Он может как делать настоящие сетевые запросы, так и тестировать приложение «изнутри», передавая HTTP-запросы напрямую в ядро Node.js-сервера без выделения реального сетевого порта. Вы можете передать объект Express-приложения (app) прямо в Supertest. Он запустит его на лету в памяти, выполнит интеграционный тест бизнес-логики и сразу закроет. Это делает тесты невероятно быстрыми.
Supertest специализируется на интеграционном тестировании HTTP-серверов, написанных на Node.js (в первую очередь — Express, но также Fastify, Koa и др.). Его ключевая особенность — прямое подключение к серверному экземпляру без запуска сетевого сокета. Это даёт два критических преимущества:
- Скорость — отсутствует накладная сетевая задержка, DNS-поиск, TLS-хендшейк;
- Изоляция: тесты не конфликтуют с другими процессами, использующими тот же порт.
Как это работает
Вместо того чтобы отправлять запрос через fetch или axios на http://localhost:3000, Supertest оборачивает Express-приложение в "виртуальный агент":
Код ITЗагрузка примера кода…
Здесь app — ссылка на объект Express. Запрос проходит через middleware, роутеры, контроллеры, но останавливается до уровня listen().
Применение в интеграционном тестировании
- Проверка middleware (аутентификация, логирование, валидация);
- Тестирование обработчиков ошибок (например, что
next(new AppError('NOT_FOUND'))возвращает 404); - Интеграция с in-memory БД (например, SQLite в режиме
:memory:) или mocked-репозиториями; - Проверка заголовков, кук, CORS-политик.
Когда Supertest не подходит
- При тестировании взаимодействия с внешними сервисами (например, шлюзом API, обратным прокси);
- При необходимости проверки TLS-настроек, keep-alive, HTTP/2;
- При работе с gRPC или GraphQL (требуются специализированные клиенты).
Supertest — инструмент для внутренней интеграционной проверки. Для end-to-end тестирования того же API через реальный сетевой стек (например, через Nginx) потребуется дополнять его axios или fetch.
Karate DSL
Karate — наиболее нестандартный инструмент в списке. Он реализует идею: тест — это спецификация, а не программа. Сценарии пишутся на упрощённом диалекте Gherkin, но без необходимости реализовывать step definitions на Java — логика встроена в DSL.
Пример сценария для Задачи API
Код ITЗагрузка примера кода…
Сильные стороны Karate в контексте интеграционного тестирования
- Самодокументируемость: сценарий читается как техническое требование;
- Встроенные возможности:
- JSON/XML validation (через
matchи#-шаблоны); - Поддержка multipart, form-data, binary payloads;
- Генерация отчётов в формате Cucumber (HTML);
- Встроенная поддержка параллелизма (
karate.parallel()); - Работа с SOAP, GraphQL, gRPC, Kafka, JDBC "из коробки".
- JSON/XML validation (через
- Независимость от языка приложения: сценарии не привязаны к Java — их может писать QA-инженер без глубоких знаний JVM.
Ограничения и нюансы
- Уход от привычной парадигмы кода — отладка сложных условий (например, циклов, рекурсии) затруднена;
- Меньше контроля над окружением по сравнению с RestAssured (например, сложнее интегрировать Testcontainers);
- Обучение требует переосмысления подхода к тестированию.
Karate особенно эффективен при:
- Развитой практике BDD в команде;
- Необходимости вовлечения нетехнических стейкхолдеров в написание проверок;
- Тестировании legacy-систем с нестабильными или плохо документированными API.
SoapUI / ReadyAPI
SoapUI — один из старейших инструментов, изначально созданный для тестирования SOAP-сервисов (отсюда название). Сегодня он поддерживает REST, GraphQL, JDBC, JMS и даже gRPC, но его архитектура остаётся ориентированной на XML-центричность и визуальное проектирование.
Исторически SoapUI создавался как главный инструмент для работы со сложными «тяжелыми» протоколами SOAP/WSDL, но современные версии (особенно ReadyAPI) полноценно поддерживают REST, GraphQL, gRPC, а также брокеры сообщений (например, Kafka).
Как SoapUI применяется в интеграционном тестировании
- Импорт WSDL/XSD: автоматическая генерация запросов и схем валидации для SOAP;
- Тестовые сюиты как дерево — каждый тест — это последовательность шагов (HTTP-запрос, Groovy-скрипт, условный переход, цикл), визуально представленная в иерархии;
- Data-Driven Testing — параметризация через внешние файлы (Excel, CSV, базы данных);
- Property Transfer: передача значений между шагами через XPath/JsonPath (например, извлечь
//orderIdиз ответа и подставить в следующий запрос).
Почему SoapUI всё ещё актуален
- В госсекторе и enterprise-средах до сих пор широко используются SOAP-интерфейсы — SoapUI остаётся de facto стандартом для их верификации;
- Готовые шаблоны для Безопасность-тестов (WS-Security, OAuth 1.0), compliance-проверок (HIPAA, PCI DSS);
- Поддержка MTOM для передачи бинарных вложений в SOAP.
Ограничения для современных REST-проектов
- Groovy-скрипты в SoapUI — мощный, но малопопулярный язык: сложность поддержки командой;
- Отсутствие нативной интеграции с Git (файлы проекта — бинарные .xml, конфликты при merge);
- Высокая стоимость ReadyAPI (коммерческая версия) для расширенных функций (load testing, mocking).
SoapUI оправдан при работе в смешанных средах (SOAP + REST) или при строгих требованиях к traceability (каждый шаг теста имеет идентификатор, привязанный к требованиям).
Apache JMeter
JMeter изначально проектировался как инструмент для стресс- и нагрузочного тестирования. Однако его гибкая архитектура позволяет использовать его и для функциональной верификации API — особенно в случаях, где:
- Требуется одновременно проверить корректность и производительность;
- Нет возможности внедрить кодовые тесты (например, black-box тестирование стороннего сервиса);
- Необходима визуальная сборка сложных workflow (ветвления, циклы, логика извлечения данных).
Пошаговая сборка одного HTTP-запроса через JMeter API (без .jmx и GUI) — Практикум — API-тестер на Groovy и JMeter.
Как JMeter применяется в интеграционном тестировании
- HTTP Request Sampler: отправка GET/POST/PUT-запросов;
- Post-Processors:
- JSON Extractor — извлечение значений по JsonPath (
$.id); - Regular Expression Extractor — для XML/HTML;
- XPath2 Extractor — для строгой XML-валидации.
- JSON Extractor — извлечение значений по JsonPath (
- Assertions:
- Response Assertion — проверка текста, кода, заголовков;
- JSON Assertion — валидация по JSON Schema (требует плагина);
- Duration Assertion — проверка времени ответа.
- Logic Controllers:
- If Controller — условное выполнение;
- While Controller — циклы ожидания (например, polling статуса задачи);
- Module Controller — повторное использование частей сценария.
Преимущества JMeter для функциональных проверок
- Независимость от стека: запускается везде, где есть Java;
- Поддержка протоколов помимо HTTP — FTP, JDBC, JMS, SMTP, LDAP;
- Готовые отчёты — Aggregate Report, Response Times Over Time, etc.
Почему JMeter — не основной инструмент для интеграционного тестирования
- Отсутствие типобезопасности: ошибки в JsonPath/XPath выявляются только при запуске;
- Сложность отладки — нет пошагового выполнения, breakpoints, watch-выражений;
- Проблемы с версионированием: .jmx-файлы — XML без форматирования, merge-конфликты трудно разрешать;
- Избыточность: для простых CRUD-сценариев интерфейс JMeter излишне громоздок.
JMeter целесообразно использовать в двух случаях:
- Когда функциональные и нагрузочные проверки логически связаны (например, "проверить, что при 100 RPS API не возвращает 5xx");
- Для black-box интеграционного тестирования, когда исходный код недоступен, а контракт — единственный ориентир.
Навигация по разделу "Тестирование"
- Маршрут: О разделе · Резюме раздела · Карта уровней и практик (Unit / Integration / UI / E2E, TDD, BDD)
- Теория и процесс: Основы · Классификация · Жизненный цикл · Порядок этапов · Артефакты качества
- Уровни проверок: Unit · Integration · E2E, системное и UI · API · Тестовые дублёры · Покрытие кода · White-box · Мутационное тестирование
- Практика QA: Документация · Тест-дизайн · Ручное веб · SQL
- Автоматизация: Стратегия и пирамида · Каталог инструментов · Selenium · Playwright
- Практикум и углубление: Подготовка среды и создание первого теста · Проверка взаимодействия компонентов · Проверка пользовательского сценария · Проверка надежности под нагрузкой · Мобильное · Нагрузка · Безопасность · Самопроверка · Доп. материалы курса · Инструменты с низким кодом для тестирования · Тестирование нейроморфных систем