pytest - 获取fixture参数的值

时间:2017-05-18 12:02:43

标签: python pytest

有没有办法保存参数的值,由pytest fixture提供:

以下是conftest.py

的示例
# content of conftest.py

import pytest

def pytest_addoption(parser):
    parser.addoption("--parameter", action="store", default="default",
                     help="configuration file path")

@pytest.fixture
def param(request):
    parameter = request.config.getoption("--parameter")
    return parameter

以下是pytest模块的示例:

# content of my_test.py

def test_parameters(param):
    assert param == "yes"

好的 - 一切正常,但有一种方法可以在测试之外获得param的值 - 例如使用一些内置pytest函数pytest.get_fixture_value["parameter"]

已编辑 - 详细解释我想要取得什么成就

我正在编写一个模块,在部署之后为测试提供参数,在pytest中编写。我的想法是,如果有人测试看起来像这样:

class TestApproachI:
    @load_params_as_kwargs(parameters_A)
    def setup_class(cls, param_1, param_2, ... , param_n):
        # code of setup_class

    def teardown_class(cls):
        # some code

    def test_01(self):
        # test code

这个人给了我一个配置文件,解释了运行他的代码的参数,我将分析这些参数(在其他一些脚本中),我将使用命令pytest --parameters=path_to_serialized_python_tuple test_to_run运行他的测试将按正确的顺序包含此某人参数的提供值。我会告诉那个人(带有测试)将这个装饰器添加到他希望我提供参数的所有测试中。这个装饰器看起来像这样:

class TestApproachI:
    # this path_to_serialized_tuple should be provided by 'pytest --parameters=path_to_serialized_python_tuple test_to_run'
    @load_params(path_to_serialized_tuple) 
    def setup_class(cls, param_1, param_2, ... , param_n):
        # code of setup_class

    def teardown_class(cls):
        # some code

    def test_01(self):
        # test code

装饰器功能应如下所示:

def load_params(parameters):
    def decorator(func_to_decorate):
        @wraps(func_to_decorate)
        def wrapper(self):
            # deserialize the tuple and decorates replaces the values of test parameters
            return func_to_decorate(self, *parameters)
        return wrapper
    return decorator

2 个答案:

答案 0 :(得分:2)

我正在使用 pytest-lazy-fixture 来获取任何装置的值:

  • 首先使用 pip install pytest-lazy-fixturepipenv install pytest-lazy-fixture 安装
  • 然后,如果需要,只需将夹具分配给这样的变量:
    fixture_value = pytest.lazy_fixture('fixture')

灯具必须用引号包裹

答案 1 :(得分:1)

parameter设置为os环境变量,然后通过os.getenv('parameter')

在测试中的任何位置使用它

所以,你可以使用like,

@pytest.fixture
def param(request):
    parameter = request.config.getoption("--parameter")
    os.environ["parameter"]=parameter 
    return parameter

@pytest.mark.usefixtures('param')
def test_parameters(param):
    assert os.getenv('parameter') == "yes"