Короткий ответ: вы не можете делать это так, как хотите, то есть с помощью приборов: https://github.com/pytest-dev/pytest/issues/2155. В основном, число вещей, которые были получены или возвращены, должно быть известно заранее, чтобы Pytest правильно вычислилграфик зависимостей фикстуры и теста.
Похоже, что единственный способ - это исправить элементы списка перед передачей их любому из декораторов pytests.Вот пример, связанный с вашим другим вопросом, показывающий, что проблема не может быть решена, скажем, генератором:
import pytest
def gen_lines():
with open('file_that_does_not_exist') as f:
yield from f
@pytest.fixture(scope='session')
def create_file():
with open('file_that_does_not_exist', 'w') as f:
print('ABC', file=f)
print('DEF', file=f)
@pytest.fixture(params=gen_lines())
def line_fixture(request):
return request.param
def test_line(line_fixture):
assert True
Это не удастся во время сбора, когда pytest превращает ваш генератор в список.Добавление зависимости к line_fixture
на create_file
не поможет ни по той же причине.
На данный момент ваш единственный реальный вариант - запустить create_file
во время загрузки модуля или раньше.
import pytest
def gen_lines():
with open('file_that_does_not_exist') as f:
yield from f
def create_file():
with open('file_that_does_not_exist', 'w') as f:
print('ABC', file=f)
print('DEF', file=f)
create_file()
@pytest.fixture(params=gen_lines())
def line_fixture(request):
return request.param
def test_line(line_fixture):
assert True
Список не обязательно должен быть статическим сам по себе.Это просто не может быть создано приспособлением.Но не позволяй этому остановить тебя.Вы можете поместить код для определения и запуска create_file
в отдельный модуль и просто импортировать его, где вам нужно, в качестве утилиты.Это затмит все беспорядочные детали и сделает ваш код таким же чистым, как и в случае с приборами.