pytest - повторить неудачный тест после всех других тестов
В моем сценарии у меня есть один тест, который записывает файл, и один (но, возможно, еще много) тестов, которые захотят прочитать этот файл. Я не могу просто извлечь запись этого файла в функцию / фикстуру, потому что она включает в себя некоторые другие фикстуры, которые внутри запускают какой-то другой двоичный файл и тот двоичный файл, который записывает этот файл. Так что у меня есть прибор, который проверяет, есть ли файл там.
Что я пробовал до сих пор:
- Плагины flaky и https://pypi.org/project/pytest-rerunfailures/ - не подходят, так как они оба перезапускают тест сразу при сбое (когда файл все еще отсутствует), и я хочу добавить его в конец очереди теста.
- вручную измените очередь теста, например:
...
request.session.items.append(request.node)
pytest.xfail("file not present yet")
этот вид работает, но только когда я бегу на одном бегуне (без xdist, или не включив его, передав -n0
cli arg, в моем отчете о тестировании я вижу что-то вроде этого:
test_load_file_before_save xfail
test_save_file PASSED
test_load_file PASSED
test_load_file_before_save PASSED
при запуске с xdist тест xfailed не повторяется. Кто-нибудь знает, как поступить? Какой-нибудь способ заставить xdist обновить список тестов?
2 ответа
Вы можете использовать pytest.cache для получения статуса выполнения теста и добавления этого теста в очередь в случае сбоя.
if request.config.cache.get(request.node):
request.session.items.append(request.node)
pytest.xfail("file not present yet")
Вы также можете установить пользовательские значения в кеш Pytest, которые будут использоваться при разных запусках с request.config.cache.set(data,val)
,
Если вы пишете файл, который находится в тестовом каталоге, вы можете использовать --looponfail
переключатель pytest-xdist. Он просматривает каталог и перезапускает тест, пока тесты не пройдут. Из документации:distributed and subprocess testing:
-f, --looponfail run tests in subprocess, wait for modified files and
re-run failing test set until all pass.
Ссылки, которые могут быть полезны: Pytest-кеш
В качестве дружеского предложения я бы порекомендовал вам сделать ваши тесты независимыми друг от друга, если вы планируете его запуск в параллельных потоках.
Установите этот пакет: pytest-rerunfailures используйте эту команду: pip install pytest-rerunfailures
Чтобы повторно запустить все ошибки теста, используйте параметр командной строки --reruns с максимальным количеством запусков тестов:
$ pytest --reruns 5
Неудачный прибор или setup_class также будут повторно выполнены.
Чтобы добавить время задержки между повторными запусками, используйте параметр командной строки --reruns-delay с количеством секунд, которое вы хотели бы подождать перед запуском следующего повторного запуска теста:
$ pytest --reruns 5 --reruns-delay 1