如何将带有参数的装饰器中的变量传递给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
假设我正在使用 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