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

Другие вопросы по тегам