Что такое тестирование ETL?

ETL (Extract, Transform, Load) — процесс перемещения данных из систем-источников в целевые системы, обычно хранилища данных или аналитические базы. Тестирование ETL проверяет корректность, полноту и производительность этого процесса.

Системы-источники → Extract → Transform → Load → Целевая система
(базы данных,        (извлечь  (очистить,    (вставить  (хранилище данных,
 API, файлы)          данные)   конвертировать, в цель)   аналитическая БД)
                                агрегировать)

Баги ETL дорогостоящи, так как повреждают аналитические данные. Если отчёт показывает неверные цифры выручки из-за неправильной конвертации валют в pipeline, бизнес-решения на этих данных ошибочны.

Три фазы тестирования ETL

Фаза 1: Тестирование извлечения

Проверьте, что данные извлекаются из источников корректно.

Тест-кейсы:

  • Все ожидаемые записи извлечены (сравнение количества).
  • Фильтры работают корректно (диапазоны дат, фильтры статусов).
  • Инкрементальное извлечение берёт только новые или изменённые записи.
-- Источник: Подсчёт записей для окна извлечения
SELECT COUNT(*) FROM source_orders
WHERE updated_at >= '2025-01-01' AND updated_at < '2025-01-02';

-- Staging: Проверка того же количества после извлечения
SELECT COUNT(*) FROM staging_orders
WHERE source_date >= '2025-01-01' AND source_date < '2025-01-02';

Фаза 2: Тестирование трансформации

Проверьте, что трансформации данных дают корректные результаты.

ТрансформацияПримерТест
Конвертация типаСтрока даты → DATEПроверить обработку формата, часовые пояса
Конвертация валютыUSD → EURПроверить курсы обмена, округление
АгрегацияДневные → месячные итогиПроверить совпадение сумм
ДедупликацияУдаление дубликатовПроверить сохранение правильной записи
Значения по умолчаниюNULL → «Неизвестно»Проверить обработку всех NULL
Бизнес-правилаМаппинг статусовПроверить применение правил

Фаза 3: Тестирование загрузки

Проверьте, что трансформированные данные корректно записаны в целевую систему.

Проверки качества данных

Полнота

SELECT COUNT(*) FROM target_orders WHERE customer_id IS NULL;
-- Ожидается: 0

Точность

SELECT SUM(total) FROM source_orders WHERE order_date = '2025-01-15';
SELECT SUM(total_converted) FROM target_orders WHERE order_date = '2025-01-15';

Согласованность

SELECT COUNT(*) FROM target_order_items oi
LEFT JOIN target_orders o ON oi.order_id = o.order_id
WHERE o.order_id IS NULL;
-- Ожидается: 0

Тестирование обработки ошибок

ETL-pipeline-ы должны корректно обрабатывать ошибки:

  1. Плохие записи: Данные с невалидными форматами или пропущенными полями.
  2. Сетевые сбои: Система-источник недоступна при извлечении.
  3. Изменения схемы: Источник добавляет или удаляет колонки.
  4. Всплески объёма: 10x от нормального объёма данных.

Инкрементальная vs полная загрузка

Полная загрузка: Удаляет и пересоздаёт все данные в цели.

Инкрементальная загрузка: Обрабатывает только новые или изменённые записи. Сложнее тестировать.

Упражнение: Тестирование ETL-pipeline

Подготовка

Создайте таблицы источника и цели, вставьте данные с намеренными проблемами.

Задание 1: Валидация извлечения

Напишите запросы для проверки полноты извлечения:

  1. Подсчёт записей источника по дате.
  2. Подсчёт записей источника по региону.
  3. Идентификация записей с проблемами качества до трансформации.

Задание 2: Валидация трансформации

Симулируйте трансформацию (ETL агрегирует по продукту, месяцу и региону, конвертирует в USD):

  1. Проверьте конвертацию валют: EUR по курсу 1.08, GBP по курсу 1.27.
  2. Проверьте агрегацию: Widget A в регионе North за январь должен дать 20 единиц, $500 USD.
  3. Проверьте маршрутизацию ошибок: Записи с отрицательным количеством, NULL-продуктом или невалидной валютой должны попасть в таблицу etl_errors.

Задание 3: Валидация загрузки (сверка)

После выполнения ETL проверьте:

  1. Общая выручка в источнике (после конвертации) равна выручке в цели.
  2. Общее количество в источнике (исключая ошибки) равно количеству в цели.
  3. Число ошибочных записей совпадает с ожидаемым (3 плохих записи).
  4. Нет дублирующих строк в сводке.

Задание 4: Тест идемпотентности

  1. Запустите pipeline один раз. Зафиксируйте состояние цели.
  2. Запустите pipeline снова с теми же данными.
  3. Проверьте идентичность состояния (без дубликатов, те же количества).

Задание 5: Тест инкрементальной загрузки

  1. Запустите ETL для данных 15 января.
  2. Добавьте новые записи за 16 января.
  3. Запустите ETL для 16 января (инкрементально).
  4. Проверьте, что данные 15 января не изменились и данные 16 января добавлены.

Результаты

  1. Запросы валидации извлечения с результатами.
  2. Запросы проверки трансформации.
  3. Отчёт сверки с сравнением итогов источника и цели.
  4. Результаты теста идемпотентности.
  5. Проверка инкрементальной загрузки.