我有一种情况,我想对在Airflow DAG中通过on_failure_callback
调用的操作员进行集成测试。
此DAG的一个最小示例如下:
def failure_callback(context):
# CustomOperator in this case links to an external K8s service
handle_failure = CustomOperator(
task_id="handle_failure",
timestamp=context["ts"]
)
handle_failure.execute(context=context)
args = {
"catchup": False,
"retries": 3,
"retry_delay": timedelta(seconds=30),
"start_date": START_DATE,
"on_failure_callback": failure_callback,
}
with DAG("foo", schedule_interval=None, default_args=args) as dag:
task_to_fail = SomeOperator()
我的第一个测试想法是运行task_to_fail
,让它失败,并通过其他一些过程验证failure_callback
的结果,尝试以下操作:
import pytest
from airflow.models import DagBag, TaskInstance
from dateutil import parser
@pytest.fixture
def foo_dag():
dag_id = "foo"
dag_bag = DagBag("dags")
return dag_bag.dags[dag_id]
@pytest.mark.integration
def test_task_to_fail(foo_dag):
execution_date = parser.parse("2000-01-01T00:00+00:00")
task_id = "task_to_fail"
task = foo_dag.get_task(task_id=task_id)
task_instance = TaskInstance(task, execution_date)
with pytest.raises(Exception):
task_instance.run(ignore_task_deps=True, ignore_ti_state=True, test_mode=True)
assert "INSERT DESIRED OUTCOME OF `failure_callback` HERE"
我遇到的问题是,运行failure_callback
时似乎没有调用pytest
。我怀疑这是由于TaskInstance的调用方式(即未运行on_failure_callback
,但不确定。
我的问题:
task_to_fail
任务的上游,我想避免在测试期间运行许多昂贵的操作。是否有可能从特定任务(在这种情况下为pytest
开始,用task_to_fail
执行的完整DAG?