首页 > 解决方案 > 使用不同的设置运行相同的 pytest

问题描述

所以我想多次运行相同的测试(最好是并行,但那是另一回事),只是设置不同的变量。我需要在不同的设备上测试相同的东西,所以我必须在每次设置时更改设备名称。这是我已经走了多远,但它不起作用:

import pytest
from appium import webdriver

device_list = ["x", "y", "z"]

class TestLogin():

    @pytest.mark.parametrize("device_setup", device_list)
    def setup(self, device_setup):
        self.driver = webdriver.Remote(command_executor='http://172.18.0.2:4444/wd/hub',
                desired_capabilities= {
                    'deviceName': device_setup,
                    })

    def teardown(self):
        self.driver.quit()

    def test_a(self):
        # Do something

    def test_b(self):
        # Do another thing

标签: pythonpytest

解决方案


您不能参数化该setup方法,但您可以使用自动使用的夹具:

device_list = ["x", "y", "z"]

class TestLogin:

    @pytest.fixture(params=device_list, autouse=True)
    def device_setup(self, request):
        self.driver = webdriver.Remote(
            command_executor='http://172.18.0.2:4444/wd/hub',
            desired_capabilities={
                'deviceName': request.param,
            })
        yield
        self.driver.quit()

    def test_a(self):
        # Do something

这将使用设备列表的每个参数执行每个测试,就好像您将mark.parametrize装饰器放在每个函数之前一样。

更新:如果您只想为每个参数运行一次设置,则可以使用会话范围的固定装置:

class TestLogin:

    @pytest.fixture(params=device_list, autouse=True, scope="session")
    def device_setup(self, request):
        self.driver = webdriver.Remote(
            command_executor='http://172.18.0.2:4444/wd/hub',
            desired_capabilities={
                'deviceName': request.param,
            })
        yield
        self.driver.quit()

    def test_a(self):
        # Do something

    def test_b(self):
        # Do something

这将运行设置 3 次(每个驱动程序参数一次)而不是 6 次。


推荐阅读