Что такое тестирование 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-ы должны корректно обрабатывать ошибки:
- Плохие записи: Данные с невалидными форматами или пропущенными полями.
- Сетевые сбои: Система-источник недоступна при извлечении.
- Изменения схемы: Источник добавляет или удаляет колонки.
- Всплески объёма: 10x от нормального объёма данных.
Инкрементальная vs полная загрузка
Полная загрузка: Удаляет и пересоздаёт все данные в цели.
Инкрементальная загрузка: Обрабатывает только новые или изменённые записи. Сложнее тестировать.
Упражнение: Тестирование ETL-pipeline
Подготовка
Создайте таблицы источника и цели, вставьте данные с намеренными проблемами.
Задание 1: Валидация извлечения
Напишите запросы для проверки полноты извлечения:
- Подсчёт записей источника по дате.
- Подсчёт записей источника по региону.
- Идентификация записей с проблемами качества до трансформации.
Задание 2: Валидация трансформации
Симулируйте трансформацию (ETL агрегирует по продукту, месяцу и региону, конвертирует в USD):
- Проверьте конвертацию валют: EUR по курсу 1.08, GBP по курсу 1.27.
- Проверьте агрегацию: Widget A в регионе North за январь должен дать 20 единиц, $500 USD.
- Проверьте маршрутизацию ошибок: Записи с отрицательным количеством, NULL-продуктом или невалидной валютой должны попасть в таблицу etl_errors.
Задание 3: Валидация загрузки (сверка)
После выполнения ETL проверьте:
- Общая выручка в источнике (после конвертации) равна выручке в цели.
- Общее количество в источнике (исключая ошибки) равно количеству в цели.
- Число ошибочных записей совпадает с ожидаемым (3 плохих записи).
- Нет дублирующих строк в сводке.
Задание 4: Тест идемпотентности
- Запустите pipeline один раз. Зафиксируйте состояние цели.
- Запустите pipeline снова с теми же данными.
- Проверьте идентичность состояния (без дубликатов, те же количества).
Задание 5: Тест инкрементальной загрузки
- Запустите ETL для данных 15 января.
- Добавьте новые записи за 16 января.
- Запустите ETL для 16 января (инкрементально).
- Проверьте, что данные 15 января не изменились и данные 16 января добавлены.
Результаты
- Запросы валидации извлечения с результатами.
- Запросы проверки трансформации.
- Отчёт сверки с сравнением итогов источника и цели.
- Результаты теста идемпотентности.
- Проверка инкрементальной загрузки.