В pytest можно зарегистрировать очистку через request.addfinalizer(), а из фикстуры вернуть ресурс обычным return. Finalizer добавляют после успешного действия, которое нужно отменить.
Что можно использовать как альтернативу `yield` в pytest-фикстуре?
В pytest можно зарегистрировать очистку через request.addfinalizer(), а из фикстуры вернуть ресурс обычным return. Finalizer добавляют после успешного действия, которое нужно отменить.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
В pytest можно зарегистрировать очистку через request.addfinalizer(), а из фикстуры вернуть ресурс обычным return. Finalizer добавляют после успешного действия, которое нужно отменить.
Пример с условным API:
@pytest.fixture
def user(request, api):
created = api.create_user()
request.addfinalizer(lambda: api.delete_user(created.id))
return created
Зарегистрированная функция очистки будет вызвана и при последующей ошибке setup в этой фикстуре. Поэтому важно не регистрировать удаление до появления ресурса. Несколько finalizer выполняются в обратном порядке регистрации. Это не защита от аварийного завершения процесса или отключения машины.
Источник: docs.pytest.org.