Что такое хранимая процедура в SQL и как вы их использовали в контексте тестирования?

«Что такое хранимая процедура в SQL и как вы их использовали в контексте тестирования?» — вопрос из категории Тестовая документация, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Хранимая процедура (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();

Основные сценарии использования в тестировании:

  1. Подготовка тестового окружения: Быстрая очистка и наполнение БД предопределённым набором данных перед прогоном тестов.
  2. Проверка сложных бизнес-правил: Например, процедура, которая рассчитывает итоговую стоимость заказа со скидками и налогами, которую можно сравнить с расчётом в приложении.
    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;
  3. Эмуляция фоновых процессов: Запуск процедур, которые имитируют работу cron-заданий или джобов (например, архивация старых записей).
  4. Валидация целостности данных: Процедура, которая проверяет согласованность данных между связанными таблицами после выполнения теста.

Преимущества для QA:

  • Повторяемость: Одинаковое состояние БД перед каждым тестом.
  • Скорость: Выполнение на стороне сервера обычно быстрее, чем множественные запросы из кода.
  • Инкапсуляция логики: Сложная последовательность действий скрыта за простым вызовом CALL.
  • Безопасность: Можно выдать права на выполнение процедуры, не давая прямого доступа на модификацию таблиц.

Недостатки/риски: Привязка к конкретной СУБД (миграция между MySQL, PostgreSQL, Oracle может потребовать переписывания), сложность отладки.