You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单元测试中Mock从AWS SSM参数存储获取Airflow变量?

如何Mock Airflow从SSM参数存储获取变量的单元测试

核心思路

直接Mock Airflow的Variable.get()方法即可,无需关心变量实际存储在SSM还是其他后端——因为Variable.get()是统一的上层调用入口,和底层存储实现解耦。

方法1:用unittest.mock直接Patch

这是最直接的方式,针对你的变量键值对编写Mock逻辑:

from unittest.mock import patch
from airflow.models import Variable

def test_your_airflow_code():
    # 定义要Mock的SSM参数键值对
    mock_ssm_vars = {
        'a/b/c': 'true',
        'a/b/d': 'test'
    }

    # Patch Variable.get方法,根据传入的key返回对应值
    with patch.object(Variable, 'get') as mock_get:
        mock_get.side_effect = lambda key, **kwargs: mock_ssm_vars[key]

        # 调用你的业务代码(示例)
        key1 = Variable.get('a/b/c')
        key2 = Variable.get('a/b/d')

        # 验证结果和调用情况
        assert key1 == 'true'
        assert key2 == 'test'
        mock_get.assert_any_call('a/b/c')
        mock_get.assert_any_call('a/b/d')

方法2:用Pytest Fixture封装重复逻辑

如果多个测试用例需要Mock相同的变量,可以封装成Fixture复用:

import pytest
from unittest.mock import patch
from airflow.models import Variable

@pytest.fixture
def mock_ssm_variables():
    mock_vars = {
        'a/b/c': 'true',
        'a/b/d': 'test'
    }
    with patch.object(Variable, 'get') as mock_get:
        mock_get.side_effect = lambda key, **kwargs: mock_vars[key]
        yield mock_get

def test_task1(mock_ssm_variables):
    result = Variable.get('a/b/c')
    assert result == 'true'
    mock_ssm_variables.assert_called_once_with('a/b/c')

def test_task2(mock_ssm_variables):
    result = Variable.get('a/b/d')
    assert result == 'test'

为什么AIRFLOW_VAR_xxx无效?

Airflow的环境变量方式要求变量名是合法的环境变量格式(不能包含/等特殊字符),而你的变量路径a/b/c包含斜杠,无法转换成符合要求的环境变量名,因此这种方法不适用你的场景。

内容的提问来源于stack exchange,提问作者Sphinx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 18:42:19