【Airflow】Apache Airflow ~ 単体試験 / 環境設定編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2024/06/13/222403

で、Apache Airflow(MWAA)の単体試験を扱った。
今回は、それをLocalで動かせる環境を構築する

目次

【0】前提条件
【1】構築手順
 0)ディレクトリ構成
 1)docker-compose を作成する
 2)requirements.txt を作成する
【2】コマンド実行例
 1)環境構築する
 2)コンテナ上に入る
 3)テストを実行する

【0】前提条件

* docker compose が動かせる環境であること
 => docker-compose については、以下の関連記事を参照のこと。

Docker compose ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2022/04/28/000000

【1】構築手順

0)ディレクトリ構成

├── docker-compose-test.yml ... 「1)docker-compose を作成する」
├── dags
│   └── hello_world.py ... 「Apache Airflow ~ 単体試験 / 入門編 ~」
├── requirements
│   └── requirements.txt ... 「2)requirements.txt を作成する」
└── tests
    ├── __init__.py
    └── test_hello_world.py ... 「Apache Airflow ~ 単体試験 / 入門編 ~」

Apache Airflow ~ 単体試験 / 入門編 ~
https://dk521123.hatenablog.com/entry/2024/06/13/222403

1)docker-compose を作成する

* 以下の関連記事を元に作成

https://dk521123.hatenablog.com/entry/2021/11/07/132014

docker-compose-test.yml

version: "3"
services:
  postgres:
    image: postgres:13-alpine
    environment:
      - POSTGRES_USER=airflow
      - POSTGRES_PASSWORD=airflow
      - POSTGRES_DB=airflow
    ports:
      - "5432:5432"
    logging:
      options:
        max-size: 10m
        max-file: "3"
  local-runner:
    image: amazon/mwaa-local:2_8
    restart: always
    depends_on:
      - postgres
    environment:
      - LOAD_EX=n
      - EXECUTOR=Local
      - DEFAULT_PASSWORD=test
      - AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres:5432/airflow
    logging:
      options:
        max-size: 10m
        max-file: "3"
    volumes:
      - "${PWD}/dags:/usr/local/airflow/dags"
      - "${PWD}/plugins:/usr/local/airflow/plugins"
      - "${PWD}/requirements:/usr/local/airflow/requirements"
      - "${PWD}/startup_script:/usr/local/airflow/startup"
      - "${PWD}/tests:/usr/local/airflow/tests"
    ports:
      - "28080:8080"
    command: local-runner
    healthcheck:
      test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
      interval: 30s
      timeout: 30s
      retries: 3
  # ★オプション(なくてもいい)
  localstack:
    image: localstack/localstack:latest
    container_name: "localstack"
    ports:
      - "4566:4566"
    environment:
      - SERVICES=s3
  aws-cli:
    image: mesosphere/aws-cli
    container_name: "aws-cli"
    volumes:
      - ./resources:/tmp/resources
    environment:
      - AWS_ACCESS_KEY_ID=dummyaccess
      - AWS_SECRET_ACCESS_KEY=dummysecret
      - AWS_DEFAULT_REGION=us-west-2
    entrypoint: /bin/sh -c
    command: >
      "
        aws --endpoint http://localstack:4566 s3 mb s3://reports
        aws --endpoint http://localstack:4566 s3 mb s3://reports-output
        aws --endpoint http://localstack:4566 s3 cp /tmp/resources/fake-report.json \
        s3://reports/fake-report.json
      "
    depends_on:
      - localstack

2)requirements.txt を作成する

requirements.txt

pytest

【2】コマンド実行例

1)環境構築する

docker compose -f docker-compose-test.yml up -d

2)コンテナ上に入る

docker-compose exec local-runner bash

3)テストを実行する

$ pytest tests
============================= test session starts ==============================
platform linux -- Python 3.10.9, pytest-8.2.2, pluggy-1.5.0
rootdir: /usr/local/airflow
plugins: anyio-3.7.1
collected 1 item                                                               

tests/test_hello_world.py .                                              [100%]

=============================== warnings summary ===============================
...
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
======================== 1 passed, 25 warnings in 2.35s ========================

参考文献

https://takemikami.com/2023/0515-docker-compose.html
https://qiita.com/yaboxi_/items/5000ab8d598d86cfe1f7
https://medium.com/its-tinkoff/testing-of-apache-airflows-dags-with-docker-compose-and-pytest-c75be554b184

関連記事

Apache Airflow ~ 単体試験 / 入門編 ~
https://dk521123.hatenablog.com/entry/2024/06/13/222403
Apache Airflow ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/09/28/135510
Apache Airflow ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2021/07/18/004531
Apache Airflow ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2021/07/24/233012
Apache Airflow ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2021/07/28/234319
Apache Airflow ~ リトライ ~
https://dk521123.hatenablog.com/entry/2021/10/10/000000
Apache Airflow ~ タイムアウト
https://dk521123.hatenablog.com/entry/2021/10/12/000000
MWAA Local ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2021/11/05/233309
MWAA Local ~ 環境構築編 / Docker compose ~
https://dk521123.hatenablog.com/entry/2021/11/07/132014
MWAA Local ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/10/21/233404
単体試験 / pytest ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/12/13/224810
単体試験 / pytest ~ 基本編 / Fixture ~
https://dk521123.hatenablog.com/entry/2021/11/24/163751
単体試験 / pytest ~ 基本編 / pytest-mock ~
https://dk521123.hatenablog.com/entry/2021/11/25/131615
単体試験 / unittest ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/10/02/223658
単体試験 / unittest ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2021/03/31/000000
Docker compose ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2022/04/28/000000