在 Python 中,setup_class()__init__() 都是用于初始化的方法,但它们有不同的用途和使用场景。

相同点

  • 两者都用于初始化操作
  • 都在对象创建或测试执行前被调用

不同点

特性__init__()setup_class()
用途普通类的构造函数测试框架(pytest)中的类级别setup方法
调用时机每次创建类的新实例时在整个测试类执行前只调用一次
所属领域面向对象编程测试框架
参数接收self作为第一个参数接收cls作为第一个参数(类方法)
调用次数每个实例一次每个测试类一次

代码示例

import pytest

# 普通类使用 __init__()
class RegularClass:
    def __init__(self, value):
        self.value = value
        print(f"RegularClass initialized with value: {value}")
    
    def display(self):
        print(f"Value: {self.value}")

# 测试类使用 setup_class()
class TestExample:
    @classmethod
    def setup_class(cls):
        """在整个测试类执行前只运行一次"""
        cls.shared_resource = "Shared Data"
        print("Setup class - this runs once before any tests")
    
    def __init__(self):
        """注意:在pytest测试类中通常不定义__init__"""
        print("Test instance created")
    
    def test_method_1(self):
        print(f"Test method 1 using {self.shared_resource}")
        assert True
    
    def test_method_2(self):
        print(f"Test method 2 using {self.shared_resource}")
        assert True

# 演示代码
if __name__ == "__main__":
    print("=== 演示 RegularClass 的 __init__() ===")
    obj1 = RegularClass(10)
    obj2 = RegularClass(20)
    obj1.display()
    obj2.display()
    
    print("\n=== 演示 TestClass 的 setup_class() ===")
    # 注意:实际测试中pytest会自动调用setup_class()
    test_instance = TestExample()
    # 手动调用setup_class来演示
    TestExample.setup_class()
    test_instance.test_method_1()
    test_instance.test_method_2()

何时使用哪种方法

  • 在普通Python类中,使用__init__()来初始化实例属性
  • 在使用pytest进行测试时,使用setup_class()来进行测试类级别的初始化
  • 在unittest框架中,类似的类级别setup方法是setUpClass()

注意事项

  1. 在pytest测试类中,通常不需要定义__init__()方法
  2. setup_class()需要使用@classmethod装饰器
  3. setup_class()主要用于设置所有测试方法共享的资源

在实际应用中,根据你的需求选择合适的方法:如果是创建普通Python对象,使用__init__();如果是设置测试环境,使用setup_class()

更多推荐