如何将带有参数的装饰器中的变量传递给pytest单元测试?

How to pass variables from a decorator with arguments to a pytest unit test?

假设我正在使用 pytest 进行一些需要一些配置的单元测试。假设我还想添加一些自定义配置,具体取决于我尝试创建的单元测试。

所以,我目前有以下内容:

import pytest

def load_configuration(custom_config=None):
    """Loads some default configuration, and if necessary injects some custom configuration"""
    config = some_complicated_stuff()
    if custom_config:
        config.update(custom_config)
    return config


@pytest.fixture(scope="function")
def foo():
    return 69


def test_bar_long_way(foo):
    config = load_configuration(custom_config={"bar": 42})
    assert foo == 69
    assert config[bar] == 42
    # do stuff with foo and config

有没有一种方法可以使用装饰器(我们称之为 load_config)将该自定义配置注入到单元测试中,而不必在单元测试本身中创建配置?在这个简化的示例中,它很短,但实际上这需要更多 space。我正在寻找一种使它看起来像这样的方法:

@load_config({"bar": 42})
def test_bar_with_decorator(config, foo):
    assert foo == 69
    assert config["bar"] == 42
    # do stuff with foo and config

我不知道如何创建这个 load_config 装饰器。任何帮助将不胜感激:).

import pytest


def some_complicated_stuff():
    return {"abc": 123}


def load_configuration(custom_config=None):
    """Loads some default configuration, and if necessary injects some custom configuration"""
    config = some_complicated_stuff()
    if custom_config:
        config.update(custom_config)
    return config


@pytest.mark.parametrize('config', [load_configuration({"bar": 42})])
def test_bar_long_way(config):
    assert config["bar"] == 42
    # do stuff with foo and config

parametrize通常用于运行同一个测试函数,但为其参数赋予不同的值,但我们可以将它用于运行一次。

如果你喜欢更好的装饰器:

def custom_config(config_val):
    return pytest.mark.parametrize('config', [load_configuration(config_val)])


@custom_config({"bar": 42})
def test_bar_long_way(config):
    assert config["bar"] == 42