如何在每个测试用例之间使用 pytest fixture 和共享变量

How to use pytest fixture and sharing variable between each testcase

我需要用 python3 和 selenium webdriver 编写一些 ui 测试。使用以下测试用例,测试运行良好。但是,我的问题是编写测试用例的更好方法是什么,以及如何在每个测试用例和 pytest fixture 函数之间传递 "base" 变量 我需要在每个测试用例之前 1:open 主页,2:在每个测试用例之后重新加载主页,并通过在每个测试用例和 pytest fixture 函数之间共享变量 "base" 来减少代码。 导入pytest 来自 modules.base 导入首页

class TestLogin(object):

    def setup_method(self, method):
        self.driver = WebDriver(desired_capabilities=desired_capabilities, command_executor=command_executor)
        self.current_method_name = method.__name__

    def teardown_method(self, method):
        self.driver.close()
        self.driver.quit()

    @pytest.fixture(scope="function")
    def loadpage():
        self.base = Home(self.driver).open()

    def loadLogin():
        base.loadLogin()

    def test_a(self):
        base = Home(self.driver).open()
        assert True == base.dotesta()
        base.loadLogin()

    def test_b(self):
        base = Home(self.driver).open()
        assert True == base.dotestb()
        base.loadLogin()

    def test_c(self):
        base = Home(self.driver).open()
        assert True == base.dotestc()
        base.loadLogin()

    def test_d(self):
        base = Home(self.driver).open()
        assert True == base.dotestd()
        base.loadLogin()

对于您当前的要求,您不需要使用夹具。这是您的代码。

class TestLogin(object):

    def setup_method(self, method):
        self.driver = WebDriver(desired_capabilities=desired_capabilities, command_executor=command_executor)
        self.current_method_name = method.__name__
        self.base = Home(self.driver).open()

    def teardown_method(self, method):
        self.base.loadLogin()
        self.driver.close()
        self.driver.quit()

    def test_a(self):
        assert True == self.base.dotesta()

    def test_b(self):
        assert True == self.base.dotestb()

    def test_c(self):
        assert True == self.base.dotestc()

    def test_d(self):
        assert True == self.base.dotestd()

编辑: 为了只打开一次页面,将设置和拆卸替换为

    def setup_class(cls):
        cls.driver = WebDriver(desired_capabilities=desired_capabilities, command_executor=command_executor)
        cls.current_method_name = method.__name__
        cls.base = Home(self.driver).open()

    def teardown_method(cls):
        cls.base.loadLogin()
        cls.driver.close()
        cls.driver.quit()

有关 cls 的详细信息。