Python 中 setup_class() 和 __init__() 的区别与相同点
·
在 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()
注意事项
- 在pytest测试类中,通常不需要定义
__init__()方法 setup_class()需要使用@classmethod装饰器setup_class()主要用于设置所有测试方法共享的资源
在实际应用中,根据你的需求选择合适的方法:如果是创建普通Python对象,使用__init__();如果是设置测试环境,使用setup_class()。
更多推荐
所有评论(0)