Как запустить метод перед всеми тестами во всех классах?

Я пишу тесты селена с набором классов, каждый из которых содержит несколько тестов. Каждый класс открывается и закрывает Firefox, что имеет два последствия:

  • супер медленный, открытие firefox занимает больше времени, чем запуск теста в классе...
  • выйдет из строя, потому что после того, как firefox закрыт, он пытается быстро открыть его из селена, что приводит к ошибке "Ошибка 54"

Я мог бы решить ошибку 54, возможно, добавив сон, но все равно будет очень медленно.

Итак, что я хотел бы сделать, это повторно использовать те же экземпляры Firefox во всех тестовых классах. Это означает, что мне нужно запустить метод перед всеми тестовыми классами и другой метод после всех тестовых классов. Таким образом, "setup_class" и "teardown_class" недостаточно.

Ответ 1

Возможно, вы захотите использовать приспособление "autouse" для сеанса:

# content of conftest.py or a tests file (e.g. in your tests or root directory)

@pytest.fixture(scope="session", autouse=True)
def do_something(request):
    # prepare something ahead of all tests
    request.addfinalizer(finalizer_function)

Это будет работать впереди всех тестов. Финализатор вызывается после завершения последнего теста.

Ответ 2

Использование сеансового прибора, предложенного hpk42, будет работать во многих случаях, но прибор будет работать только после того, как будут собраны все тесты. Если вы хотите запустить код перед сборкой тестов, вы используете плохо документированный pytest_configure или pytest_sessionstart:

# content of conftest.py

def pytest_sessionstart(session):
    """ before session.main() is called. """
    pass

def pytest_sessionfinish(session, exitstatus):
    """ whole test run finishes. """
    pass

Ответ 3

Начиная с версии 2.10, существует более чистый способ снести прибор, а также определить его область действия. Таким образом, вы можете использовать этот синтаксис:

@pytest.fixture(scope="module", autouse=True)
def my_fixture():
    print ('INITIALIZATION')
    yield param
    print ('TEAR DOWN')

Параметр autouse: Из документация:

Вот как работают аутсорные светильники в других областях:

  • autouse fixtures подчиняются области scope = ключевому слову: если у устройства autouse есть scope = 'session', он будет запускаться только один раз, независимо от того, где он определен. scope = 'class' означает, что он будет запускаться один раз для каждого класса и т.д.

  • если в тестовом модуле задано устройство autouse, все его тестовые функции автоматически его используют.

  • если в файле conftest.py определен инструмент autouse.py, тогда все тесты во всех тестовых модулях под его каталогом будут ссылаться на прибор.

    ...

Параметр "запрос": Обратите внимание, что параметр "запрос" не является необходимым для вашей цели, хотя вы можете использовать его для других целей. Из документация:

"Функция Fixture может принимать объект запроса для анализа" запрашивать "тестовую функцию, класс или контекст модуля."