Как вы очищаете ресурсы в конце сессии pytest? - PullRequest
2 голосов
/ 02 июля 2019

У меня есть набор тестов селен до конца.Я создаю экземпляр одного webdriver.ChromeDriver экземпляра, который передаю в качестве прибора для каждого теста в наборе.

'''python3
@pytest.fixture(scope="session")
def driver(request):
    return d(request)
'''

После последнего запуска теста я хочу закрыть экземпляр веб-драйвера с помощью driver.quit().

Я могу сделать это с помощью приспособления

@pytest.hookimpl(trylast=True)
def close_after_test_suite(driver, requests):
    if requests:
        driver.quit()

Однако это выполняется только в том случае, если тесты не дают сбоя во время набора.Если каждый тест пройден, браузер закроется.Если один тест не пройден, браузер останется открытым.

Как я могу использовать pytest, чтобы закрыть браузер в конце набора тестов, независимо от того, провалились ли тесты или нет?

1 Ответ

1 голос
/ 02 июля 2019

Если вы хотите запустить какой-то код при разборе, используйте yield вместо return, например:

@pytest.fixture(scope="session")
def driver(request):
    driver = d(request)
    yield driver
    driver.quit()

Однако классы selenium.webdriver.WebDriver реализуют магические методы менеджера контекста, поэтому вы также можете использовать оператор with:

@pytest.fixture(scope="session")
def driver(request):
    with d(request) as driver:
        yield driver

Другой (хотя и довольно старый, но все еще работающий) параметр использует параметр request.addfinalizer:

@pytest.fixture(scope="session")
def driver(request):
    driver = d(request)

    def f():
        driver.quit()

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