我正在尝试构建一些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
装饰器正确返回单个项目?
答案 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动态设置测试参数。