如何在unittest中测试气流dag?

时间:2018-04-24 13:33:40

标签: python unit-testing pytest airflow

我正在尝试在测试环境中测试一个具有多个任务的dag。我能够测试与dag相关的单个任务,但我想在第一个任务的dag和kick中创建几个任务。 为了测试dag中的一个任务我正在使用

  

task1.run()

正在执行。但是,当我在dag的下游一个接一个地完成许多任务时,同样不起作用。

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta


default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime(2015, 6, 1),
'email': ['airflow@example.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5),
# 'queue': 'bash_queue',
# 'pool': 'backfill',
# 'priority_weight': 10,
# 'end_date': datetime(2016, 1, 1),
}

dag = DAG('tutorial', default_args=default_args)

# t1, t2 and t3 are examples of tasks created by instantiating operators
t1 = BashOperator(
task_id='print_date',
bash_command='date',
dag=dag)

t2 = BashOperator(
task_id='sleep',
bash_command='sleep 5',
retries=3,
dag=dag)

t2.set_upstream(t1)

t1.run() # It is executing just first task.

为了运行第二个任务,我必须使用t2.run()运行,在设计DAG时我不想要这个。怎么做到这一点?

1 个答案:

答案 0 :(得分:7)

我不太确定我是否理解您的问题,但是我会尽力开始回答。

如果您的目标是仅手动运行DAG或其一部分任务,则可以从CLI实现,例如:

  • $ airflow run ...-运行任务实例
  • $ airflow test ...-测试任务实例,而无需检查依赖关系或记录数据库中的状态
  • $ airflow trigger_dag ...-触发DAG的特定DAG运行

CLI文档- https://airflow.apache.org/cli.html

我认为airflow run命令与您的用例最相关。

在运行时,执行者将自动处理DAG中的任务调度以及满足其要求的下游依赖关系。您无需在代码中的任何地方调用run()。

至于run方法本身,代码仍然存在:

问题

  1. 当您说“在测试环境中”测试DAG时,您指的是什么?像在CI上还是在单元测试中一样?
  2. 此代码是用于测试还是来自您实际的DAG之一的代码?
  3. 这与您最近的其他问题Test Dag run for Airflow 1.9 in unittest有关吗?​​