Py.test 夹具:在范围夹具中使用函数夹具

Gau*_*hah 5 python selenium fixtures pytest python-2.7

我面临着 pytest 装置的一个小问题,非常感谢您的帮助。

我有一些功能装置,如下所述。为了简单起见,我没有展示其实现。

@pytest.fixture()
def get_driver():
    pass

@pytest.fixture()
def login(get_driver):
    pass

@pytest.fixture()
def settings(login):
    pass
Run Code Online (Sandbox Code Playgroud)

问题是我还需要一个(会话级别)固定装置,它可以在运行第一个测试用例之前进行设置。(实际开始测试)。即进入设置页面并创建一些设置。(登录后)

现在的问题是我不能使用会话级别的固定装置这样做,因为我不能在会话级别使用功能级别的固定装置。或者我可以吗?

@pytest.fixture(scope="session")
def setup(settings):
    settings.create_settings()
    pass
Run Code Online (Sandbox Code Playgroud)

Tar*_*ani 3

您将需要使用解决方法。该操作需要在设置为 的function范围固定装置中完成。autouseTrue

您需要在session基础固定装置中初始化一个变量,它将检查是否settings已完成。如果没有完成,那么您将进行设置并将标志更改为False

下面是一个工作示例

import pytest


@pytest.fixture(scope="session", autouse=True)
def settings_page():
    config = {"config_done": False}
    return config


@pytest.fixture()
def init(request):
    print("init called")
    return "init"


@pytest.fixture()
def driver():
    print("driver called")

    return "driver"


@pytest.fixture(autouse=True)
def init_settings(settings_page, driver):
    if not settings_page["config_done"]:
        print("Settings being done only the first time")
        settings_page["config_done"] = True


@pytest.fixture()
def login():
    print("login called")
    return "login"


@pytest.fixture()
def logged_in_driver(init, driver, login):
    print("logged in driver is ready")
    return (init, driver, login)


@pytest.fixture()
def non_logged_in_driver(init, driver):
    print("non logged in driver is ready")
    return (init, driver)


def test_1(logged_in_driver):
    print("test_1")


def test_2(non_logged_in_driver):
    print("test_2")
Run Code Online (Sandbox Code Playgroud)

输出如下

test.py driver called
Settings being done only the first time
init called
login called
logged in driver is ready
.test_1
driver called
init called
non logged in driver is ready
.test_2
Run Code Online (Sandbox Code Playgroud)

所以你可以看到设置只发生一次