Как проверить отправку запроса и наличие сообщения в базе данных?
Что проверяют
Умеете ли вы проверить цепочку целиком: запрос ушёл, сервер ответил правильно и запись действительно появилась в базе с верными полями. Интервьюер смотрит, найдёте ли вы именно свою запись и учтёте ли асинхронность. Следом спрашивают, что делать, если сообщение пишется в базу не сразу.
Как отвечать
Каркас из четырёх шагов:
- отправка: через интерфейс с открытой вкладкой Network в DevTools или напрямую в API через Postman,
curl, автотест на pytest сrequestsили на Java с REST Assured. В Network видно, что запрос ушёл один раз, с нужным методом, телом и заголовками; - ответ: статус (201 или 200 по контракту), тело по схеме и главное идентификатор созданного сообщения. Все дальнейшие проверки идут по нему;
- база:
SELECT text, author_id, status, created_at FROM messages WHERE id = :id. Сверяются все поля: текст без обрезки и потери кодировки, автор, статус, время с учётом часового пояса. Отдельно проверить, что запись одна, а не две; - асинхронность: если сообщение идёт через очередь (Kafka, RabbitMQ), запись появится с задержкой. Проверять нужно опросом с таймаутом, например каждые 500 мс в течение 10 секунд, а не сразу после ответа.
Негативная сторона не менее важна: невалидный запрос возвращает 400 или 422 и не оставляет в базе ничего, в том числе частично записанных строк. Двойной клик по кнопке или повтор запроса после таймаута не создаёт дубль, если в API заявлена идемпотентность.
Про доступ: для проверок достаточно пользователя базы с правами на чтение, а очистка тестовых данных идёт через API или отдельную фикстуру, чтобы прогоны не мешали друг другу.
Где спотыкаются
Ищут запись по тексту: WHERE text = 'test'. Находится сообщение из прошлого прогона, и тест проходит, даже если текущий запрос ничего не записал.
Ограничиваются кодом 200. Сервер может ответить успехом и не сохранить данные из-за ошибки в фоновой обработке, поэтому без проверки базы тест неполный.
Проверяют асинхронную запись сразу после ответа или ставят фиксированную паузу. В первом случае тест падает случайно, во втором он медленный и всё равно иногда падает.