【问题标题】:Using fixtures in Pytest在 Pytest 中使用固定装置
【发布时间】:2018-10-03 09:11:43
【问题描述】:

我在 conftest.py 文件中有如下代码

@pytest.fixture(scope="session", autouse=True)
def app(request):
    global fixture
    browser = request.config.getoption("--browser")
    base_url=target['baseUrl'])
    fixture = Application(browser=browser,base_url=web_config['baseUrl'])
    print("\n BEFORE SESSION")
    fixture.session.login()
    return fixture


@pytest.fixture(scope="session", autouse=True)
def stop(request):
    def fin():
        print("\n AFTER SESSION")
        fixture.session.ensure_logout()
        fixture.destroy()
    request.addfinalizer(fin)
    return fixture

测试文件如下所示。即夹具,我明明不叫。

import pytest

@pytest.yield_fixture()
def setup_method():
    print("\n BEFORE METHOD")
    yield
    print("\n AFTER METHOD")

@pytest.mark.usefixtures("setup_method")
def test_add_text_element(app):
    print("\n RUN TEST")
    app.element.add_blank_page()
    app.element.add_element(element_name='Header')

但是如果我需要设置一些其他类设置怎么办?如果我得到另一个夹具,我如何在测试文件中使用它,而不是现在使用的那个?

【问题讨论】:

    标签: python selenium-webdriver automated-tests pytest


    【解决方案1】:

    您可以在this doc 中找到关于 py.test 中的固定装置的所有信息。您可以在下面找到如何使用固定装置的示例。首先不要使用global。然后注意灯具的autouse 参数。对于设置和拆卸yield_fixture 将是您的选择。使用usefixtures 作为类的装饰器。类将很好地组织您的测试代码。您可以在此article (RUS) 中找到有关使用的更多信息

    conftest.py

    @pytest.yield_fixture()
    def destroy_method():
        yield
        print("\n DESTROY")
    
    
    @pytest.yield_fixture(scope="session", autouse=True)
    def app(request):
        browser = request.config.getoption("--browser")
        fixture = Application(browser=browser, base_url=web_config['baseUrl'])
        print("\n BEFORE SESSION")
        fixture.session.login()
        yield fixture
        print("\n AFTER SESSION")
        fixture.session.ensure_logout()
        fixture.destroy()
    

    测试文件将如下所示:

    @pytest.yield_fixture()
    def setup_method():
        print("\n BEFORE METHOD")
        yield
        print("\n AFTER METHOD")
    
    
    @pytest.fixture()
    def fix1():
        return 1
    
    
    @pytest.fixture()
    def fix2():
        return 2
    
    
    @pytest.mark.usefixtures("setup_method", "destroy_method")
    class TestSuiteA:
        def test_add_text_element(self, fix1, fix2):
            print("\n RUN TEST")
            assert fix1 + 1 == fix2
    

    【讨论】:

      【解决方案2】:

      来自 pytest 文档:

      “yield_fixture”函数:

      从 pytest-3.0 开始,fixture 使用 普通的fixture装饰器可以使用yield语句来提供 夹具值并执行拆卸代码,就像 yield_fixture 在以前的版本中。

      仍支持将函数标记为 yield_fixture,但已弃用 并且不应在新代码中使用。

      参考:https://docs.pytest.org/en/latest/yieldfixture.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-10
        • 1970-01-01
        • 2020-10-04
        • 1970-01-01
        • 1970-01-01
        • 2021-02-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多