Тестирование API и основы работы с базами данных (SQL)
В предыдущих темах курса мы разобрали роль QA в SDLC/STLC, виды и стратегии тестирования, тест-дизайн и тестовую документацию, а также основные процессы и инструменты (Agile/Scrum, Git, CI/CD, трекеры задач).
Следующий важный шаг к уверенной практике QA — уметь тестировать API и понимать основы работы с базами данных через SQL. Это даёт два больших преимущества:
вы можете проверять продукт быстрее и глубже, чем только через UI
вы можете подтверждать факты: что реально сохранилось в базе, какие статусы и записи создались, почему система ведёт себя такЭта статья даст практическую базу:
что такое API и как устроены HTTP-запросы и ответы
что и как проверять в API (функционально и нефункционально)
какие инструменты чаще всего используются (Postman, Swagger, curl)
основы SQL, которые нужны QA: чтение данных, простые изменения в тестовых средах, проверка эффектов API!Схема взаимодействия API с базой данных и точек контроля для QA
Что такое API и зачем QA его тестирует
API (Application Programming Interface) — это интерфейс, через который одна программа взаимодействует с другой. В веб-разработке чаще всего QA сталкивается с HTTP API: клиент (веб/мобильное приложение) отправляет HTTP-запросы на сервер и получает ответы.
Зачем API тестировать отдельно от UI:
API обычно стабильнее UI и быстрее для проверок
через API проще воспроизводить дефекты и проверять негативные сценарии
многие дефекты живут на уровне бизнес-логики и данных, а UI лишь показывает последствия
API тесты хорошо автоматизируются и часто входят в CIТермины и основы HTTP удобно сверять по справке: HTTP (MDN).
Как устроен HTTP-запрос и ответ
Из чего состоит HTTP-запрос
Обычно запрос включает:
Метод: что хотим сделать с ресурсом
URL: адрес ресурса и параметры
Заголовки (headers): метаданные (тип данных, авторизация, корреляция)
Тело (body): данные, которые отправляем (часто JSON)Из чего состоит HTTP-ответ
Ответ обычно включает:
Статус-код: результат обработки
Заголовки: метаданные ответа
Тело: данные (часто JSON) или описание ошибкиЧастые HTTP-методы
| Метод | Идея | Типичный пример |
|---|---|---|
| GET | получить данные | получить список заказов |
| POST | создать сущность или запустить операцию | создать заказ |
| PUT | заменить сущность целиком | полностью обновить профиль |
| PATCH | частично обновить | поменять только телефон |
| DELETE | удалить | удалить адрес доставки |
Справка по методам: HTTP request methods (MDN).
Популярные статус-коды
| Код | Значение | Что важно QA |
|---:|---|---|
| 200 | OK | успешный ответ с данными |
| 201 | Created | сущность создана; часто возвращают id |
| 204 | No Content | успешно, но тело пустое |
| 400 | Bad Request | ошибка валидации, формат запроса неверный |
| 401 | Unauthorized | нет авторизации или она неверная |
| 403 | Forbidden | авторизован, но нет прав |
| 404 | Not Found | ресурса нет или недоступен по id |
| 409 | Conflict | конфликт состояния, дубль, гонка |
| 429 | Too Many Requests | лимиты/рейты |
| 500 | Internal Server Error | ошибка сервера, часто дефект или проблема окружения |
Важно: одинаковый статус-код в разных продуктах может означать немного разное, поэтому QA всегда опирается на контракт API и договорённости команды.
REST и контракты API
Часто (не всегда) HTTP API построено в стиле REST: ресурсы имеют URL, а операции описываются методами.
Ключевая идея для QA: у API должен быть контракт.
Распространённый формат описания контракта — OpenAPI (часто его называют Swagger).
контракт фиксирует эндпоинты, методы, схемы запросов и ответов
QA использует контракт как источник ожиданий: что считается корректным запросом и корректным ответомОфициальная спецификация: OpenAPI Specification.
Инструменты для тестирования API
Postman
Postman полезен для ручного тестирования:
коллекции запросов и окружения (dev/stage)
переменные, pre-request scripts и базовые автопроверки
импорт OpenAPIОфициальный сайт: Postman.
Swagger UI
Swagger UI часто разворачивают вместе с сервисом:
можно увидеть список эндпоинтов
попробовать запросы в браузере
быстро сверить схемыcurl
curl полезен, когда нужно:
быстро повторить запрос в терминале
приложить в баг-репорт точную команду
проверить проблему вне PostmanДокументация: curl.
Пример запроса:
Что именно проверять в API
Ниже — практический чек-лист того, что QA обычно проверяет в API. Логику приоритизации берём из прошлых тем: сначала критические потоки и риски.
Проверки корректности ответа
Статус-код соответствует сценарию
Тело ответа соответствует контракту
- типы полей
- обязательность полей
- корректность форматов (дата, валюта)
Смысл данных корректен
- бизнес-правила (например, сумма заказа равна сумме позиций)
- корректные статусы
Проверки входных данных и валидаций
Для каждого важного поля полезно применить техники тест-дизайна из прошлой статьи:
классы эквивалентности: валидные и невалидные группы значений
граничные значения: минимумы, максимумы, пустые строкиПример негативных проверок для POST /users:
пустое обязательное поле email
некорректный формат email
слишком длинное значение
неожиданный тип данных (строка вместо числа)Ожидаемое поведение должно быть конкретным: статус-код, структура ошибки, тексты/коды ошибок по стандарту команды.
Проверки авторизации и прав доступа
Важно различать:
401: пользователь не авторизован
403: пользователь авторизован, но действие запрещеноТиповые проверки:
запрос без токена
запрос с просроченным токеном
запрос пользователя без нужной роли
попытка доступа к чужим данным по idЕсли хотите системно ориентироваться в рисках API, полезный источник: OWASP API Security Top 10.
Проверки идемпотентности и повторов
Идемпотентность означает: повторный запрос не должен приводить к нежелательным побочным эффектам.
Примеры рисков:
повторный POST создаёт дубль заказа
повторное нажатие кнопки оплаты создаёт два платежаЧто делает QA:
повторяет запросы
симулирует тайм-аут (когда клиент не получил ответ и повторил)
проверяет, как система защищается от дублей (например, через idempotency key)Проверки пагинации, сортировки и фильтров
Это частая зона дефектов, особенно при больших объёмах данных.
Что проверять:
limit и offset или cursor работают ожидаемо
сортировка стабильна и корректна
фильтр действительно фильтрует, а не игнорируется
крайние случаи: пустая выдача, последняя страницаПроверки обработки ошибок
Система должна ошибаться предсказуемо.
Хорошая практика для API:
единый формат ошибок
понятные коды ошибок для клиента
отсутствие лишних технических деталей в ответеQA фиксирует ожидания в тест-кейсах/чек-листах и в баг-репортах прикладывает:
URL
метод
заголовки (без секретов)
тело запроса
тело ответа
статус-кодНефункциональные проверки на уровне API
Даже на базовом уровне QA полезно помнить о нефункциональных рисках:
производительность: время ответа на типовых запросах
стабильность: нет ли периодических 5xx
лимиты: размер запроса, rate limiting (429)
безопасность: отсутствие утечек данных, корректные праваГлубокое нагрузочное и security-тестирование обычно выделяют отдельно, но базовые наблюдения QA на API-уровне очень ценны.
Мини-пример: как выглядит тестирование одного эндпоинта
Представим эндпоинт POST /v1/orders, который создаёт заказ.
Что QA обычно проверяет:
Успешное создание заказа
- статус
201
- в ответе есть
orderId
- созданный заказ доступен через
GET /v1/orders/{orderId}
Валидации
- пустая корзина
- отрицательное количество
- невалидный адрес
Права доступа
- неавторизованный пользователь
Защита от дублей
- повтор того же запроса
Пример запроса и ответа в формате, удобном для баг-репорта:
Зачем QA нужен SQL
API-тестирование часто упирается в вопрос: что реально произошло с данными.
SQL помогает QA:
проверять эффекты запросов (создалась ли запись, какой статус, какие поля)
готовить тестовые данные (в тестовой среде и по правилам команды)
быстро расследовать дефекты (например, почему UI показывает не то)
очищать данные после тестов (если разрешено)Важно: доступ к базе и операции INSERT/UPDATE/DELETE обычно ограничены. В продакшене QA почти всегда работает только через согласованные каналы и с минимальными правами.
База данных: минимальные понятия
Чаще всего QA сталкивается с реляционными базами данных:
данные хранятся в таблицах
таблица состоит из строк (записей) и столбцов (полей)
связи между таблицами задаются ключамиКлючевые термины:
Primary key (первичный ключ): уникальный идентификатор строки (часто id)
Foreign key (внешний ключ): ссылка на запись в другой таблице (например, orders.user_id)
Constraint (ограничение): правило целостности (например, NOT NULL, уникальность)
Index (индекс): структура для ускорения поиска (может влиять на скорость запросов)!Пример связи таблиц пользователей и заказов
SQL для QA: самые нужные команды
Ниже — базовые операции SQL, которые чаще всего нужны QA.
SELECT: чтение данных
Пример: найти заказ по id.
Что важно:
SELECT выбирает столбцы
FROM указывает таблицу
WHERE фильтрует строкиWHERE: фильтрация и осторожность
Очень частая ошибка новичков — выполнить запрос без WHERE и получить слишком много данных.
Пример: найти заказы пользователя за последние статусы.
ORDER BY и LIMIT: быстро смотреть последние изменения
JOIN: объединение таблиц
Когда данные разнесены по таблицам, вы связываете их через JOIN.
Что важно:
JOIN ... ON ... связывает таблицы по ключам
удобно использовать алиасы o, uINSERT, UPDATE, DELETE: изменения данных
В тестовых средах иногда разрешают подготовку и очистку данных.
Добавление записи:
Обновление записи:
Удаление записи:
Ключевой принцип: любые изменения делайте только при понимании последствий и обычно внутри транзакции, если это принято в команде.
Транзакции: зачем QA знать базовую идею
Транзакция — это группа операций, которая выполняется как единое целое.
Типовая логика:
либо применяются все изменения
либо не применяется ничего (если случилась ошибка)QA полезно знать это, чтобы понимать дефекты класса:
деньги списались, но заказ не создался
заказ создался, но позиции не привязалисьНа практике QA чаще всего не управляет транзакциями напрямую, но может увидеть признаки проблем в данных.
Как связывать API и SQL в проверках
Самый практичный сценарий для QA: сделать API-запрос и подтвердить данные в базе.
Пример подхода:
Вызвать API POST /v1/orders и получить orderId.
Проверить GET /v1/orders/{orderId}.
Проверить в базе:
- запись в
orders создана
- статус правильный
- сумма
total корректна
- созданные позиции заказа лежат в таблице
order_items (если она есть)
Пример проверки по orderId:
Важно: если API возвращает одно, а в базе другое, это сильный сигнал дефекта или асинхронной обработки.
Типичные проблемы, которые QA находит через API и SQL
рассинхронизация данных: UI показывает статус PAID, в БД CREATED
ошибки валидации: API принимает некорректные данные и сохраняет мусор
ошибки прав: пользователь получает чужие записи
дубли: два заказа на один запрос, два платежа
гонки и конкуренция: два параллельных запроса меняют статус некорректно
необработанные ошибки: 500 без понятного сообщения и без стабильного форматаКак оформлять баги по API и базе данных
Связь с предыдущей статьёй про баг-репорты:
цель — воспроизводимость и фактыХороший баг по API обычно содержит:
эндпоинт, метод
окружение (staging, версия)
авторизация (тип, без секретов)
тело запроса
статус-код и тело ответа
фактические данные в базе (если доступно и разрешено)Если вы прикладываете SQL-результаты:
не публикуйте персональные данные без необходимости
прикладывайте ровно те поля, которые доказывают проблемуИтоги
API-тестирование позволяет быстрее и точнее проверять бизнес-логику и данные, особенно в связке с тест-дизайном и риск-ориентированным подходом.
В HTTP важно понимать методы, статус-коды, структуру запросов и ответов, а также авторизацию и обработку ошибок.
Инструменты QA для API: Postman, Swagger UI, curl.
SQL даёт QA возможность проверять фактическое состояние данных и ускоряет расследование дефектов.
Базовый набор SQL для QA: SELECT, WHERE, ORDER BY, LIMIT, JOIN, и осторожно INSERT/UPDATE/DELETE в тестовых средах.