Ответ
Хранимая процедура (Stored Procedure) — это предварительно скомпилированный набор SQL-инструкций, сохранённый на сервере БД и выполняемый как единая операция. В тестировании они полезны для подготовки данных, сложных проверок и симуляции бизнес-логики.
Пример создания процедуры (MySQL/PostgreSQL синтаксис):
-- Создание процедуры для очистки и заполнения тестовых данных
DELIMITER //
CREATE PROCEDURE PrepareTestData()
BEGIN
-- 1. Очистка старых тестовых данных
DELETE FROM orders WHERE test_flag = TRUE;
DELETE FROM users WHERE email LIKE '%@test.example.com';
-- 2. Вставка базовых тестовых пользователей
INSERT INTO users (email, name, role) VALUES
('admin@test.example.com', 'Test Admin', 'admin'),
('user@test.example.com', 'Test User', 'user');
-- 3. Логирование действия (опционально)
INSERT INTO audit_log (action, timestamp)
VALUES ('Test data prepared', NOW());
SELECT 'Test data preparation completed' AS status;
END //
DELIMITER ;
-- Вызов процедуры
CALL PrepareTestData();
Основные сценарии использования в тестировании:
- Подготовка тестового окружения: Быстрая очистка и наполнение БД предопределённым набором данных перед прогоном тестов.
- Проверка сложных бизнес-правил: Например, процедура, которая рассчитывает итоговую стоимость заказа со скидками и налогами, которую можно сравнить с расчётом в приложении.
CREATE PROCEDURE CalculateOrderTotal(IN orderId INT, OUT total DECIMAL(10,2)) BEGIN SELECT SUM(price * quantity) * (1 - discount) INTO total FROM order_items WHERE order_id = orderId; END; - Эмуляция фоновых процессов: Запуск процедур, которые имитируют работу cron-заданий или джобов (например, архивация старых записей).
- Валидация целостности данных: Процедура, которая проверяет согласованность данных между связанными таблицами после выполнения теста.
Преимущества для QA:
- Повторяемость: Одинаковое состояние БД перед каждым тестом.
- Скорость: Выполнение на стороне сервера обычно быстрее, чем множественные запросы из кода.
- Инкапсуляция логики: Сложная последовательность действий скрыта за простым вызовом
CALL. - Безопасность: Можно выдать права на выполнение процедуры, не давая прямого доступа на модификацию таблиц.
Недостатки/риски: Привязка к конкретной СУБД (миграция между MySQL, PostgreSQL, Oracle может потребовать переписывания), сложность отладки.