Python使用Pytest类级别Fixture时出现AttributeError问题求助
如何在Pytest测试类中获取Fixture返回的多个对象
问题根源
用@pytest.mark.usefixtures("driverObjectClass1")仅会触发fixture执行,但不会将fixture返回的对象自动绑定到测试类实例上,直接访问self.config自然会抛出AttributeError。
解决方案1:测试方法参数化引用Fixture
无需使用@pytest.mark.usefixtures,直接在测试方法参数列表中传入fixture名称,解构返回的元组即可:
测试类代码
class TestLogin1: def test_valid_login(self, driverObjectClass1): # 解构fixture返回的三个对象 driver, config, logFolder = driverObjectClass1 # 后续直接使用对象 print(config["base_url"]) driver.get(config["base_url"])
解决方案2:修改Fixture,将对象绑定到测试类实例
如果希望整个测试类的所有方法都能通过self.xxx访问这些对象,可以在fixture中利用request参数获取测试类实例,手动添加属性:
conftest.py中的Fixture修改
import pytest from selenium import webdriver @pytest.fixture(scope="class") def driverObjectClass1(request): # 初始化driver、config、logFolder driver = webdriver.Chrome() config = {"base_url": "https://example.com", "timeout": 10} logFolder = "./logs/test_login" # 将对象绑定到测试类实例 request.cls.driver = driver request.cls.config = config request.cls.logFolder = logFolder yield driver, config, logFolder # 依然支持参数化方式获取 # 后置清理操作 driver.quit()
测试类代码
import pytest @pytest.mark.usefixtures("driverObjectClass1") class TestLogin1: def test_valid_login(self): # 直接通过self访问属性 print(self.config["base_url"]) self.driver.get(self.config["base_url"]) def test_invalid_login(self): # 其他测试方法可复用属性 self.driver.get(self.config["base_url"] + "/login")
两种方案对比
- 方案1更灵活,适合仅部分测试方法需要fixture返回对象的场景
- 方案2适合整个测试类复用对象的场景,无需在每个方法中重复解构
内容的提问来源于stack exchange,提问作者Bhawna
相关产品推荐
相关产品推荐

