SQL в работе тестировщика
SQL в работе тестировщика
В этом уроке объединим всё изученное и разберём, как тестировщик применяет SQL в реальной работе: транзакции для безопасных манипуляций с данными, работа с инструментами и правила безопасности.
Транзакции
Транзакция — группа SQL-операций, которые выполняются как единое целое: либо все успешно, либо ни одна.
Зачем нужны транзакции тестировщику
Представьте: вы создаёте тестового пользователя и 3 заказа. После теста хотите вернуть базу в исходное состояние, не удаляя всё вручную по одному.
BEGIN; -- начать транзакцию
INSERT INTO users (name, email) VALUES ('Тест Транзакция', 'tx@test.com');
-- ... другие операции ...
ROLLBACK; -- отменить всё — база как будто ничего не было
-- или
COMMIT; -- зафиксировать всё изменения
Команды транзакции
| Команда | Действие |
|---|---|
BEGIN | Начать транзакцию |
COMMIT | Зафиксировать все изменения |
ROLLBACK | Отменить все изменения с момента BEGIN |
SAVEPOINT имя | Создать точку сохранения внутри транзакции |
ROLLBACK TO SAVEPOINT имя | Откатиться к точке сохранения |
Паттерн: подготовка тестовых данных
BEGIN;
-- 1. Создать тестового пользователя
INSERT INTO users (name, email, is_active)
VALUES ('Тест Сценарий', 'scenario@test.com', true);
-- 2. Получить его id
-- (в клиенте DBeaver/psql: результат предыдущего INSERT виден в транзакции)
-- Используем подзапрос:
INSERT INTO orders (user_id, status, total)
SELECT id, 'pending', 1500
FROM users WHERE email = 'scenario@test.com';
INSERT INTO orders (user_id, status, total)
SELECT id, 'paid', 3000
FROM users WHERE email = 'scenario@test.com';
-- 3. Проверить результат
SELECT u.name, o.id, o.status, o.total
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.email = 'scenario@test.com';
-- Если всё верно: COMMIT
-- Если что-то не так: ROLLBACK
COMMIT;
Паттерн: тест с откатом
Этот паттерн позволяет выполнить тест и гарантированно вернуть базу в исходное состояние:
BEGIN;
-- Подготовка состояния
INSERT INTO users (name, email) VALUES ('Откатной тест', 'rollback@test.com');
-- ... здесь выполняете тест через UI или API ...
-- ... проверяете результаты через SELECT ...
-- Откат: убираем всё что создали
ROLLBACK;
-- База вернулась в исходное состояние
Это намного надёжнее, чем вручную помнить, что нужно удалить.
SAVEPOINT: частичный откат
Если транзакция большая, можно создать контрольные точки:
BEGIN;
INSERT INTO users (name, email) VALUES ('Тест 1', 't1@test.com');
SAVEPOINT after_user;
INSERT INTO orders (user_id, status, total)
VALUES (LASTVAL(), 'pending', 100);
-- Ой, ввели неверный статус...
ROLLBACK TO SAVEPOINT after_user; -- откат только до точки, пользователь остался
INSERT INTO orders (user_id, status, total)
VALUES (LASTVAL(), 'paid', 100); -- вставить правильно
COMMIT;
Инструменты работы с SQL
DBeaver (рекомендуется)
Универсальный GUI-клиент. Поддерживает PostgreSQL, MySQL, SQLite и десятки других СУБД.
Основные возможности:
- Подключение к любой СУБД через JDBC-драйвер
- SQL-редактор с подсветкой синтаксиса и автодополнением
- Браузер структуры БД (таблицы, индексы, FK)
- Редактирование данных через интерфейс
- Экспорт результатов в CSV/Excel
psql (консольный клиент PostgreSQL)
Стандартный клиент, доступен везде где есть PostgreSQL.
# Подключение
psql -h localhost -p 5432 -U postgres -d mydb
# Полезные команды внутри psql
\dt -- список таблиц
\d users -- структура таблицы users
\i file.sql -- выполнить SQL-файл
\q -- выйти
pgAdmin
Официальный веб-интерфейс PostgreSQL. Хорош для визуального просмотра структуры и выполнения запросов.
Правила безопасности
1. Только тестовая база
⚠️ Никогда не работайте с production-базой во время тестирования.
Всегда проверяйте, к какой базе вы подключены, прежде чем выполнять UPDATE или DELETE.
-- Проверить текущую базу в PostgreSQL
SELECT current_database();
2. SELECT перед изменением
Перед каждым UPDATE или DELETE сначала выполните SELECT с тем же WHERE:
-- Сначала убедитесь что нашли нужные записи
SELECT id, name, email FROM users WHERE email LIKE '%@test.com';
-- Только потом удаляйте
DELETE FROM users WHERE email LIKE '%@test.com';
3. Транзакции для изменений
Оборачивайте любое изменение данных в транзакцию. Если что-то пошло не так — ROLLBACK.
4. Не изменяйте данные пользователей
Для тестирования создавайте специальные тестовые записи с узнаваемыми маркерами (например, test_ в email).
Чеклист: SQL для каждого этапа тестирования
Перед тестом — подготовка данных
- Создать тестового пользователя с нужными правами
- Установить нужные состояния объектов (статус заказа, баланс, флаги)
- Обернуть всё в
BEGINдля возможности отката
Во время теста — проверка данных
- После создания объекта через UI — проверить через SELECT в БД
- После изменения — убедиться что данные изменились корректно
- Проверить, что не изменились лишние записи
После теста — очистка
-
ROLLBACKесли использовали транзакцию - Или DELETE тестовых данных в правильном порядке (дочерние → родительские)
- Убедиться что база вернулась в ожидаемое состояние
Типичные SQL-запросы для ежедневной работы
-- Найти последнего зарегистрированного пользователя
SELECT * FROM users ORDER BY created_at DESC LIMIT 1;
-- Проверить состояние заказа после оплаты
SELECT id, status, total, updated_at FROM orders WHERE id = 123;
-- Найти все незакрытые инциденты (баги в данных)
SELECT * FROM orders WHERE status = 'pending'
AND created_at < NOW() - INTERVAL '7 days';
-- Убедиться, что email уникален перед регистрацией
SELECT COUNT(*) FROM users WHERE email = 'newuser@example.com';
-- Ожидаем: 0 (пользователя нет → можно регистрировать)
Итоги
- Транзакция — группа операций как единое целое;
BEGIN/COMMIT/ROLLBACK - ROLLBACK — лучший способ откатить тестовые данные без ручной очистки
- SAVEPOINT — контрольная точка внутри транзакции для частичного отката
- DBeaver — универсальный инструмент, рекомендуется для ежедневной работы
- Безопасность: только тестовая БД, SELECT перед изменением, транзакции для DML
- Чеклист: подготовка → тест → проверка → очистка