Я пытаюсь создать небольшой тест 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
теперь равен всему списку ожидаемых ключей.Это не каждый отдельный ключ, как у меня со статическим списком, который был в моем тестовом файле.
Я пытался сделать так, как Олег Рыбальченко ответ предложил
@pytest.mark.parametrize("expected_keys", pytest.lazy_fixture('expected_keys_fixture')
)
def test_expected_key(expected_key):
...
Но это не работает с TypeError: 'LazyFixture' object is not iterable
.
Я понимаю, что у меня только один аргумент и у меня должен быть список, но пример в документации передает параметры декоратору fixture()
.Не я.Мой список создается по результатам файла YML.
Вопрос: Как настроить прибор так, чтобы он правильно возвращал один элемент за раз для parametrize
декоратора?