如何让基类测试方法调用子类变量(禁用__init__构造函数)
我来帮你解决这个问题,其实核心是利用Python的类属性继承机制,再配合pytest对测试类的要求调整代码即可:
解决方案说明
1. 用实例属性/类属性的方式访问子类变量
Python的子类会继承并覆盖基类的类属性,只要基类的测试方法通过实例(self)或类(cls)来访问这个属性,就能自动获取子类定义的值。同时要注意:pytest的测试方法必须是实例方法(带self)或类方法(带cls),不能是无参的普通函数,否则不仅无法访问类属性,还会导致pytest无法正常收集测试用例。
2. 修改后的代码示例
# 假设这是你已定义的get_field函数 def get_field(table): # 这里替换成你实际的业务逻辑 return f"Retrieved field from {table}" class BaseClassExample: table_name = None # 基类设置默认值,子类会覆盖 def test_field_for_both_devices(self): # 通过self访问,自动获取子类的table_name值 firstname = get_field(self.table_name) # 这里可以添加你的断言逻辑,比如: # assert firstname == "Retrieved field from Pacer"(针对SubClass1) class SubClass1(BaseClassExample): table_name = 'Pacer' # 必须添加self参数,转为实例方法 def test_field1(self): field1 = get_field(self.table_name) # 你的测试逻辑 class SubClass2(BaseClassExample): table_name = 'ICD' def test_field2(self): field2 = get_field(self.table_name) # 你的测试逻辑
3. 可选:用类方法实现(无需self)
如果你更倾向于用类方法而非实例方法,也可以这样写,效果完全一致:
class BaseClassExample: table_name = None @classmethod def test_field_for_both_devices(cls): # 通过cls访问子类的类属性 firstname = get_field(cls.table_name) # 断言逻辑 class SubClass1(BaseClassExample): table_name = 'Pacer' @classmethod def test_field1(cls): field1 = get_field(cls.table_name) # 测试逻辑
运行效果
当你执行pytest时:
- 运行
SubClass1的测试用例时,基类的test_field_for_both_devices会自动使用'Pacer'作为table_name - 运行
SubClass2的测试用例时,会自动使用'ICD'作为table_name
内容的提问来源于stack exchange,提问作者haj
相关产品推荐
相关产品推荐

