使用request.cls和scope='session'时,如何避免cls不可用的AttributeError
解决session-scoped fixture中
AttributeError: cls not available in session-scoped context的方案 报错原因
session级别的fixture会在所有测试类初始化之前就执行,此时request.cls尚未绑定到任何测试类,自然无法通过它访问类属性,这就是报错的根源。
保留核心结构的解决方案
直接操作基类的类变量,绕过request.cls的限制。因为session级fixture在整个测试会话中仅执行一次,所有继承基类的测试类都会共享这个实例,完全符合你复用实例、保留session scope和yield结构的需求。
修改后的代码如下:
基类BaseClass
class BaseClass: # 用类变量存储全局共享的实例 instance = None @pytest.fixture(scope="session", autouse=True) def setup_and_teardown(self): # 直接给BaseClass的类变量赋值,无需依赖request.cls BaseClass.instance = AnotherClass() BaseClass.instance.open_session() yield # 关闭会话时直接操作基类的实例 BaseClass.instance.close_session()
测试类TestClass(无需修改)
class TestClass(BaseClass): def awesome_test(self): value = self.instance.get_value("parameter") assert value == "correct result"
补充说明
- 所有继承
BaseClass的测试类都会共享同一个instance实例,因为session级fixture只执行一次,完全满足复用需求。 - 如果需要为不同测试类创建独立实例,那不能用session scope,得改用
scope="class",但这不符合你保留session scope的要求。
内容的提问来源于stack exchange,提问作者Darvin
相关产品推荐
相关产品推荐

