pytest如何在类的方法之间共享变量?

pytest中,setup_class是一个特殊的方法,它用于在类级别的测试开始之前设置一些初始化的状态。这个方法会在类中的任何测试方法执行之前只运行一次。

当你在setup_class中使用self来修改类属性时,你实际上是在修改类的一个实例属性。在Python中,类属性和实例属性是有所区别的:

  • 类属性是绑定到类本身的属性,通常可以通过类名直接访问(例如MyClass.my_class_attr)。
  • 实例属性是绑定到类的一个具体实例的属性,需要通过类的实例来访问(例如my_instance.my_instance_attr)。

当你在setup_class中使用self来设置属性时,你实际上是在设置实例属性。因为setup_class方法是一个实例方法(尽管它是在类级别上运行的),所以self引用的是类的一个临时实例。这意味着,任何通过这个self设置的属性都将成为这个实例的属性,而不是类的属性。

然而,由于setup_class在类级别的测试开始之前只运行一次,并且所有的测试方法都共享这个临时实例,所以任何在setup_class中设置的实例属性都将在所有的测试方法中可用,并且它们都会看到相同的值。

如果你想要在类级别上设置属性(即,希望所有实例共享相同的属性),你应该直接在类上设置属性,而不是在setup_class中使用self。例如:

python 复制代码
class MyTestClass:
    my_class_attr = None

    @classmethod
    def setup_class(cls):
        cls.my_class_attr = "some value"

    def test_method1(self):
        assert self.my_class_attr == "some value"

    def test_method2(self):
        assert self.my_class_attr == "some value"

在这个例子中,my_class_attr是一个类属性,我们在setup_class中直接修改它。因此,所有测试方法都能够访问到这个修改后的值。

总结:要想在pytest的类各个方法中共享变量,要么在setup里用self.属性设置变量,要么用cls.属性设置变量。

在其他方法中设置的变量,是不能共享的。

如下图,最后assert时,self.order_id是None

或者也可以用这种方法

相关推荐
段一凡-华北理工大学10 小时前
【高炉炼铁领域炉温监测、预警、调控智能体设计与应用】~系列文章08:多模态数据融合:让数据更聪明
人工智能·python·高炉炼铁·ai赋能·工业智能体·高炉炉温
万粉变现经纪人10 小时前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
清风明月一壶酒10 小时前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
其实防守也摸鱼11 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
callJJ11 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
小郑加油12 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习
AC赳赳老秦12 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw
.柒宇.12 小时前
AI掘金头条项目-K8s部署实战教程
python·云原生·容器·kubernetes·fastapi
KuaCpp12 小时前
C++面向对象(速过复习版)
开发语言·c++
观北海12 小时前
从 Sim2Sim 到 Sim2Real:以 ONNX 为核心的机器人策略实机落地全指南
python·机器人