selenium 使用函数作用域fixture设置类

oknwwptz  于 2022-11-29  发布在  其他
关注(0)|答案(1)|浏览(118)

我在conftest.py中有一个带有函数作用域的fixture。

@pytest.fixture()
def registration_setup(
    test_data, # fixture 1
    credentials, # fixture 2
    deployment # fixture 3
    deployment_object # fixture 4
):
    # pre-test cleanup
    do_cleanup()
    yield
    # post-test cleanup
    do_cleanup()

我在一个测试类中使用它,如下所示:

class TestClass:

    @pytest.fixture(autouse=True)
    def _inventory_cleanup(self, registration_setup):
        log('Cleanup Done!')
    
    def test_1():
        ...

    def test_2():
        ...
    
    def test_3():
        ...

现在我想创建一个新的测试类,在这里我为整个类运行一次registartion_setup fixture。这里想要的行为是,首先执行测试前清理,然后执行新测试类中的所有测试,接着是测试后清理。我该如何实现这一点,谢谢帮助。

368yc8dk

368yc8dk1#

选项1

您可以使用与其他测试类相同的方法,但是将fixture范围设置为class

class TestClass:

    @pytest.fixture(scope='class', autouse=True)
    def _inventory_cleanup(self, registration_setup):
        log('Cleanup Done!')
    
    def test_1():
        ...

    def test_2():
        ...
    
    def test_3():
        ...

但是,您需要将fixture的作用域registration_setup更改为class,以避免ScopeMismatch错误。

选项2

为了继续使用function作用域,我建议使用两个行为相同但作用域不同的fixture,如下所示:

@pytest.fixture()
def registration_setup_for_function(
    test_data, # fixture 1
    credentials, # fixture 2
    deployment # fixture 3
    deployment_object # fixture 4
):
    # pre-test cleanup
    do_cleanup()
    yield
    # post-test cleanup
    do_cleanup()

@pytest.fixture(scope='class')
def registration_setup_for_class(
    test_data, # fixture 1
    credentials, # fixture 2
    deployment # fixture 3
    deployment_object # fixture 4
):
    # pre-test cleanup
    do_cleanup()
    yield
    # post-test cleanup
    do_cleanup()

如果您的其他设备1、2、3和4具有function范围,则您也必须更改它们。

选项3

如果您不希望两个相同的装置具有不同的作用域,可以执行以下操作:
在项目根目录下的conftest.py文件中:

def pytest_configure(config):
    config.first_test_executed = False

然后,无论您在何处安装固定装置:

@pytest.fixture()
def registration_setup(
    test_data, # fixture 1
    credentials, # fixture 2
    deployment, # fixture 3
    deployment_object, # fixture 4
    request # Note the request fixture here
):
    if 'TestClass' in request.node.nodeid:
        if not request.config.first_test_executed:
            # pre-test cleanup
            do_cleanup()
            yield
            # post-test cleanup
            do_cleanup()
            request.config.first_test_executed = True
    else:
        # pre-test cleanup
        do_cleanup()
        yield
        # post-test cleanup
        do_cleanup()

我知道这仍然有点重复,但是这样类内的测试将只对整个类调用registration_setup fixture一次,而其他测试将总是调用它。也许现在知道这一点会找到更好的方法。
有关文档的更多信息:
fixture可以对请求的测试上下文进行自省
可以查看所有收集的测试的会话夹具
pytest_配置(配置)

相关问题