← назад к разделу

Всё, что помнит приложение — покупатели, заказы, товары, — хранится в базе данных. Интерфейс показывает лишь часть этого и может показать неправильно: на экране «Оплачено», а платёж не записан. Чтобы проверить, что данные сохранились и именно такими, какими нужно, тестировщик смотрит прямо в базу. Язык, на котором с базой разговаривают, — SQL.

Чтобы проверять данные, не нужно уметь всё: хватает нескольких запросов на чтение. Разберём минимум на примере интернет-магазина: таблицы взяты из тренажёра курса, запросы можно выполнить как есть.

экран говорит «оплачено» — тот же заказ спрашиваем у таблиц магазин · заказ ord-06 Оплачено платёж принят, спасибо 7 980 ₽ · карта SELECT status, paid_at FROM orders WHERE id = 'ord-06'; orders id status paid_at ord-06 PENDING_PAYMENT NULL статус не менялся, времени оплаты нет SELECT count(*) FROM payments WHERE order_id = 'ord-06'; payments id order_id amount ни одной строки на экране успех, в orders статус прежний, в payments пустодефект не «неверная надпись», а «платёж не записан»

Экран — это то, что нарисовал браузер, а не то, что осталось в базе. Два запроса разводят эти вещи: первый смотрит сам заказ (статус не менялся, времени оплаты нет), второй — таблицу платежей, где по заказу нет ни одной строки. Отсюда и формулировка дефекта: платёж не записан.

Что такое база и таблицы

База данных чаще всего устроена как набор таблиц — как листы в Excel: колонки (столбцы) и строки. Например, таблица customer (покупатели) с колонками id, email, first_name, а таблица orders (заказы) — с колонками id, customer_id, total_amount, status, paid_at.

Тестировщик обычно только читает данные, а не меняет их, и читающий запрос начинается со слова SELECT.

SELECT: показать данные

Базовый запрос — «покажи такие-то колонки из такой-то таблицы»:

живой пример

SELECT id, first_name, email FROM customer;
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

FROM называет таблицу, SELECT — колонки. Звёздочка * значит «все»:

живой пример

SELECT * FROM orders;
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

WHERE: отобрать нужные строки

WHERE — фильтр: «покажи только строки, где условие выполняется». Самое частое дело тестировщика — найти в базе запись, которую он только что создал через интерфейс.

живой пример

SELECT * FROM customer WHERE email = 'a.volkova@example.com';
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

«Покажи покупателя с таким e-mail»: зарегистрировались на сайте — выполнили запрос — убедились, что запись появилась с верным именем.

Условия комбинируют:

живой пример

SELECT * FROM orders WHERE customer_id = 'cus-01' AND status = 'PAID';
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

«Оплаченные заказы покупателя cus-01»: так проверяют, что после оплаты статус стал PAID, а не остался PENDING_PAYMENT. Текст в условии — в одинарных кавычках и ровно в том написании, в каком его хранит приложение: PAID и paid для базы обычно разные значения, и запрос с неверным регистром молча вернёт ноль строк.

Экран сказал «оплачено» — проверяем

Случай с картинки. Сначала смотрим сам заказ:

живой пример

SELECT id, status, paid_at FROM orders WHERE id = 'ord-06';
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

Статус PENDING_PAYMENT, paid_at пустой (NULL — «значения нет»). Дальше — таблица платежей:

живой пример

SELECT count(*) FROM payments WHERE order_id = 'ord-06';
Запустить

Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →

Ноль. Оплата на экране была, платёж в базе не появился — и дефект формулируется уже не как «неправильная надпись», а как «платёж не записан».

Ещё пара полезных вещей

  • Подсчёт строк: SELECT count(*) FROM orders WHERE customer_id = 'cus-01'; — сколько заказов у покупателя. Так проверяют, что создался один заказ, а не два от двойного нажатия.
  • Сортировка: ORDER BY created_at DESC в конце — «сначала самые новые»: так находят только что созданную запись.
  • JOIN (связка таблиц). Заказ хранит customer_id, а почта покупателя лежит в customer; JOIN соединяет таблицы, чтобы увидеть их вместе. Синтаксис подсматривают — на старте важно знать, что так можно.

Осторожно с боевой базой

Два правила безопасности:

  • По возможности работайте с тестовой базой, а не с боевой, где реальные пользователи; если доступ есть только к боевой — не выполняйте ничего, в чём не уверены.
  • Тестировщик почти всегда только читает (SELECT). Команды, которые меняют данные (UPDATE, DELETE), трогать без явной необходимости и понимания нельзя — можно испортить данные.

Где это применяется

SQL превращает проверку из «на экране вроде правильно» в «в базе точно правильно»: создали заказ — он там один и с верной суммой, удалили — запись исчезла или помечена удалённой. Это серый ящик в действии.

Спотыкаются чаще всего на страхе: SQL кажется «программированием». На деле для проверок хватает SELECT ... WHERE — читается почти как обычная фраза.

Коротко

  • Данные лежат в таблицах; тестировщику нужен один тип запросов — читающий SELECT.
  • WHERE отбирает строки, и текст в нём — в одинарных кавычках и в том же написании, что в базе.
  • Проверка «экран против базы» — два запроса: сам заказ и связанная с ним таблица платежей.
  • NULL — не ноль и не пустая строка, а «значения нет»: пустой paid_at значит, что оплату не проставляли.
  • count(*) ловит дубли от двойного нажатия: ждали одну строку, а их две.

Что почитать дальше