9

我正在尝试构建一个小 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现在等于整个预期键列表。当它在我的测试文件中时,它不再像我在静态列表中所拥有的每个单独的键。

我试图按照 Oleh Rybalchenko 的回答建议做

@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装饰者返回一件物品?

4

2 回答 2

3

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

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']

于 2020-07-13T16:39:11.100 回答
0

问题是夹具是在收集测试执行的,所以不可能从夹具结果中乘以你的测试。但是您可以使用pytest_generate_testshook动态参数化您的测试。

于 2020-07-13T19:56:28.503 回答