You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:20:28