首页 文章

Py.test fixture:在示波器夹具中使用功能夹具

提问于
浏览
0

我正面临一个pytest fixtures的小问题,非常感谢你的帮助 .

我有一些功能固定装置,如下所述 . 为简单起见,我没有展示实施 .

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

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

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

问题是我需要一个( session level )夹具,它在我运行第一个测试用例之前进行设置 . (实际上开始测试) . 即转到设置页面并创建一些设置 . (登录后)

现在的问题是我不能用 session level fixture 这样做,因为我不能在会话级别使用功能级夹具 . or can I?

@pytest.fixture(scope="session")
def setup(settings):
    settings.create_settings()
    pass

2 回答

  • 1

    您需要使用变通方法 . 该操作需要在 function 范围内完成,并且 autouse 设置为 True .

    您需要在基于 session 的fixture中初始化变量,这将检查 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")
    

    输出如下

    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
    

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

  • 0

    此解决方法尝试在不创建会话级夹具的情况下实现相同的结果 . 它可以满足您对上面评论中提到的 called only once before first test case 设置的需求 .

    创建 conftest.py 并放置以下内容:

    import pytest
    
    
    def pytest_sessionstart(session):
        print("Initialising Session Level Settings")
        login = "A specialized login"
        settings(login).create_settings()
    
    
    @pytest.fixture()
    def get_driver():
        print("Get Driver")
    
    
    @pytest.fixture()
    def login(get_driver):
        print("Login")
    
    
    @pytest.fixture()
    def settings(login):
        print("Settings")
    
        class Setter:
            def create_settings(self):
                print("[Success] Settings created!")
        return Setter()
    

    然后,您可以在测试中使用它,如下所示:

    def test_one(settings):
        print("Test one...")
    
    
    def test_two(settings):
        print("Test two...")
    

    执行测试应该产生接近你想要的效果(基于我到目前为止从你给出的信息中推断出的结果) .

    (py362) D:\repo\git\ens_qa>py.test -sv stackoverflow\ScopeWorkaroundTests.py
    Initialising Session Level Settings
    Settings
    [Success] Settings created!
    ============================= test session starts =============================
    platform win32 -- Python 3.6.2, pytest-3.2.1, py-1.4.34, pluggy-0.4.0 -- d:\virtualenv\py362\scripts\python.exe
    cachedir: .cache
    rootdir: D:\repo\git\ens_qa, inifile:
    collected 2 items
    
    stackoverflow/ScopeWorkaroundTests.py::test_one Get Driver
    Login
    Settings
    Test one...
    PASSED
    stackoverflow/ScopeWorkaroundTests.py::test_two Get Driver
    Login
    Settings
    Test two...
    PASSED
    
    ========================== 2 passed in 0.05 seconds ===========================
    
    (py362) D:\repo\git\ens_qa>
    

相关问题