【问题标题】:How to test airflow dag in unittest?如何在unittest中测试气流dag?
【发布时间】:2018-04-24 13:33:39
【问题描述】:

我正在尝试在测试环境中测试具有多个任务的 dag。我能够测试与 dag 关联的单个任务,但我想在 dag 中创建多个任务并启动第一个任务。 为了在 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 时不希望这样做。如何做到这一点?

【问题讨论】:

  • 我正在尝试测试 dag 的整个运行过程。如果我们将上面的代码放在测试语句中,它就不起作用。底线是我愿意使用 pytest 测试由许多依赖任务组成的整个 dag 运行。
  • Airflow Python Unit Test?的可能重复
  • 那个指向 Dag 的单元测试的链接只涉及一个任务。我想测试整个 dag 而不是每个 dag 只测试一个任务。希望这能消除混乱。
  • 到目前为止你尝试过什么?测试代码是什么样子的? dag.run()呢?
  • 我不知道为什么它没有点击。简单的 dag.run() 有效。谢谢

标签: python unit-testing pytest airflow


【解决方案1】:

我还不能完全确定我是否理解你的问题,但我会尝试开始回答。

如果您的目标是手动运行 DAG 或其任务的子集,您可以通过 CLI 实现此目的,例如:

  • $ airflow run ... - 运行一个任务实例
  • $ airflow test ... - 在不检查依赖关系或在数据库中记录状态的情况下测试任务实例
  • $ airflow trigger_dag ... - 触发 DAG 的特定 DAG 运行

CLI 文档 - https://airflow.apache.org/docs/apache-airflow/stable/cli-and-env-variables-ref.html

我认为气流运行命令是与您的用例最相关的命令。

在运行时,在 DAG 中调度任务并在满足其要求后运行下游依赖项均由执行程序自动处理。您不需要在代码中的任何位置调用 run()。

至于run方法本身,代码还在:

问题

  1. 当您说“在测试环境中”测试 DAG 时,您的确切意思是什么?比如在 CI 或单元测试中?
  2. 此代码是用于测试还是来自您的实际 DAG 之一?
  3. 这与您最近的另一个问题Test Dag run for Airflow 1.9 in unittest 有关吗?

【讨论】:

  • 感谢 Taylor 抽出时间提供答案。我必须在单元测试中测试一个具有依赖关系的 dag。因此我不希望存储在文件中/让 dag 显示在 GUI 上,因为它是一个测试 dag。我想在单元测试中加载整个 dag 并从那里触发。它曾经在 1.7 中工作,但不确定我缺少什么使其在 1.9 中工作。是的,它与我的另一个问题有关,因为它与不同的版本有关,因此将两个问题分开以避免混淆。如上例所示运行 dag 的问题是它不尊重依赖关系
猜你喜欢
  • 2017-03-31
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多