Тестирование кода Airflow

Построение пайплайнов данных с Airflow

Volker Janz

Senior Developer Advocate at Astronomer

Три уровня тестирования

Пирамида тестирования DAG

  • Целостность: загружается ли DAG без ошибок?
  • Модульный: корректна ли бизнес-логика?
  • Интеграционный: выполняется ли DAG от начала до конца?
Построение пайплайнов данных с Airflow

Тесты целостности с DagBag

from airflow.models import DagBag

dag_bag = DagBag(include_examples=False)
def test_no_import_errors(): assert len(dag_bag.import_errors) == 0
def test_dag_loaded(): assert "daily_etl" in dag_bag.dags
Построение пайплайнов данных с Airflow

Почему DAG ломаются при импорте

ModuleNotFoundError

  • ModuleNotFoundError: отсутствует пакет провайдера или неверный путь импорта
  • NameError: переименованная переменная, функция или опечатка
  • ImportError: циклические импорты между файлами DAG
  • Тесты целостности помогают избежать этих проблем
Построение пайплайнов данных с Airflow

Модульное тестирование функций задач

В файле DAG:

def clean_record(record):
    return {
        "name": record["name"].strip(),
        "email": record["email"].lower(),
    }

@task
def transform(records):
    return [clean_record(r)
            for r in records]
  • Выносите бизнес-логику в отдельные функции

В файле тестов:

from dags.data_cleaning import (
    clean_record,
)

def test_strips_whitespace():
    result = clean_record(
      {"name": "  Alice  ",
       "email": "[email protected]"}
    )
    assert result["name"] == "Alice"
  • Фокусируйте модульные тесты на бизнес-логике
Построение пайплайнов данных с Airflow

Интеграционные тесты с dag.test()

import pytest
from airflow.models import DagBag
from pendulum import datetime

dag_bag = DagBag(include_examples=False)

def test_etl_pipeline(): dag = dag_bag.get_dag("etl_output") assert dag is not None dag.test(logical_date=datetime(2026, 1, 15)) output = Path("/tmp/etl_results.json") assert output.exists() results = json.loads(output.read_text()) assert len(results) == 2
  • Запустите DAG с контролируемыми входными данными и проверьте результат
Построение пайплайнов данных с Airflow

Тестирование в CI

CI-конвейер

  • Целостность + модульные: при каждом коммите (быстро)
  • Интеграционные: при pull request или ночном запуске (медленнее)
  • Ни один DAG не попадает в продакшн без прохождения всех трёх уровней
Построение пайплайнов данных с Airflow

Давайте потренируемся!

Построение пайплайнов данных с Airflow

Preparing Video For Download...