如何在 pytest 会话结束时清理资源?

Jay*_*ers 7 python selenium pytest

我有一套硒端到端测试。我实例化一个webdriver.ChromeDriver实例,并将其作为套件中每个测试的固定装置传递。

'''python3
@pytest.fixture(scope="session")
def driver(request):
    return d(request)
'''
Run Code Online (Sandbox Code Playgroud)

最后一次测试运行后,我想用 关闭 webdriver 实例driver.quit()

我可以用一个固定装置来完成这个

@pytest.hookimpl(trylast=True)
def close_after_test_suite(driver, requests):
    if requests:
        driver.quit()
Run Code Online (Sandbox Code Playgroud)

然而,只有当测试在套件期间没有失败时才会运行。如果每个测试都通过,浏览器将关闭。如果单个测试失败,则浏览器将保持打开状态。

无论测试是否失败,如何使用 pytest 在测试套件结束时关闭浏览器?

hoe*_*ing 5

如果您想在拆卸时运行一些代码,请使用yield代替return,例如:

@pytest.fixture(scope="session")
def driver(request):
    driver = d(request)
    yield driver
    driver.quit()
Run Code Online (Sandbox Code Playgroud)

但是,这些selenium.webdriver.WebDriver类实现了上下文管理器魔术方法,因此您也可以使用以下with语句:

@pytest.fixture(scope="session")
def driver(request):
    with d(request) as driver:
        yield driver
Run Code Online (Sandbox Code Playgroud)

另一个(虽然很旧,但仍然有效)选项是使用以下request.addfinalizer选项:

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

    def f():
        driver.quit()

    request.addfinalizer(f)
    return driver
Run Code Online (Sandbox Code Playgroud)