Предотвращение преждевременного разрушения устройства сеанса при повторном запуске тестов - PullRequest
0 голосов
/ 21 декабря 2018

Я настраиваю некоторую конфигурацию в conftest.py для повторного запуска неудачных тестов pytest в определенных случаях.

Эта функция была добавлена ​​в conftest.py.Идея состоит в том, что тест можно настроить на повторную попытку с помощью фикстуры запроса, чтобы установить для request.node.retry значение True.

def pytest_runtest_protocol(item, nextitem):
"""Checks for manual mark and if found, reruns test if requested"""
if item.get_closest_marker("manual") is None:
    return

# Infinite loop for rerunning tests
while True:
    # Run test and get result
    item.ihook.pytest_runtest_logstart(
        nodeid=item.nodeid,
        location=item.location
    )

    # Hangs on this line on retry
    reports = runtestprotocol(item, nextitem=nextitem)

    # Check results
    if not getattr(item, 'retry', False):
        for report in reports:
            item.ihook.pytest_runtest_logreport(report=report)
        return True
    else:
        delattr(item, 'retry')

Это работает, когда выполняется несколько тестов, но если выполняется только один тест, или если тест является последним в серии, то первый сбой теста вызывает разрыв всех приборов.Приспособления на уровне функций могут быть настроены заново (на самом деле, я хочу, чтобы они обеспечивали чистое состояние), но приборы на уровне сеансов также сносятся, и мне нужны они для перезапуска теста.

Есть ли какой-нибудь способ предотвратить демонтаж устройства сеансового уровня, пока я не буду готов?

1 Ответ

0 голосов
/ 03 января 2019

Решение этой проблемы было немного хакерским - это добавление фиктивного теста, который не регистрировался.

Установите pytest-ordering.Добавьте новый файл с фиктивным тестом где-нибудь, помеченным как последний, например,

@pytest.mark.last
def test_dummy():
    assert True

Затем в функции pytest_runtest_protocol пропустите фиктивный тест в самом начале:

def pytest_runtest_protocol(item, nextitem):
    if item.name == 'test_dummy':
        return False
    # Rest of function

Как последнийФункция всегда будет фиктивной функцией, которую нельзя повторить, фиксация сессии будет действительна при тестировании и будет снесена только после этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...