如何正确地从pytest固定装置返回列表以用于参数设置?

时间:2019-06-19 16:28:06

标签: python pytest fixtures parametrized-testing

我正在尝试构建一些pytest测试,以确保所有期望的密钥都存在于redis中。我有一个预期密钥列表,我将其存储为YML文件。测试本身将查询redis以确保列表中的每个预期键都存在。

最初,我将此文件设置为test_keys.py文件中的巨型列表。设置如下:

expected_keys = ['key1','key2','key3']
@pytest.mark.parametrize('expected_key', expected_keys)
def test_expected_key(expected_key):
    ...

这有效。由于我想针对Redis环境的其他一些检查复制这种类型的测试,因此我不想将带有几百个密钥的多个列表放入这些文件中。

我想我可以将它们拉出到YML文件中,并通过固定装置加载密钥。

我的灯具看起来像这样:

@pytest.fixture
def expected_keys_fixture():
    with open('expected_keys.yml'), 'r') as f:
        return yaml.safe_load(f)['keys']

YML看起来像这样:

keys:
  - key1
  - key2
  - key3

我的测试装饰器更改为:

@pytest.mark.parametrize("expected_keys", [
    (pytest.lazy_fixture('expected_keys_fixture'))
])
def test_expected_key(expected_key):
    ...

我正在使用pytest-lazy-fixture软件包。

我在这里遇到的问题是expected_keys现在等于期望键的 entire 列表。就像我在测试文件中使用静态列表时一样,不再需要每个单独的键。

我试图按照Oleh Rybalchenko answer的建议做

@pytest.mark.parametrize("expected_keys", pytest.lazy_fixture('expected_keys_fixture')
)
def test_expected_key(expected_key):
    ...

但是,这失败了,TypeError: 'LazyFixture' object is not iterable

我知道我只有一个argname,应该有一个列表,但是文档中的示例将参数传递给fixture()装饰器。我不是。我的列表是由YML文件的结果生成的。


问题:如何调整我的固定装置,使其一次可以为parametrize装饰器正确返回单个项目?

2 个答案:

答案 0 :(得分:0)

在相同的情况下,我发现的唯一方法是拒绝灯具并直接调用该函数。

def expected_keys_fixture():
    with open('expected_keys.yml', 'r') as f:
        return yaml.safe_load(f)['keys']


@pytest.mark.parametrize("expected_key",
                         expected_keys_fixture())
def test_expected_key(expected_key):
    assert expected_key in ['key1', 'key2', 'key3']

答案 1 :(得分:0)

问题是夹具在收集测试后 之后执行,因此无法将测试与夹具结果相乘。但是您可以使用pytest_generate_tests hook动态设置测试参数。