如何在pytest Hypothesis测试中让父类测试方法使用子类类变量
解决方法
问题核心:原代码中@given(u=st.just(t))在类定义阶段就会执行,此时t绑定的是TestInt.t(即int),子类TestBool继承测试方法时,装饰器已经固定了u的取值,无法动态使用子类重定义的t。
方案一:保留@given装饰器的动态取值方式
通过st.dynamic延迟获取当前测试实例所属类的t变量,确保子类运行时能拿到自己重定义的值:
from hypothesis import given, strategies as st class TestInt: t = int @given(u=st.dynamic(lambda ctx: st.just(ctx.test_case.__self__.__class__.t))) def test_subclass(self, u): assert issubclass(u, int) class TestBool(TestInt): t = bool
st.dynamic会在测试运行时执行传入的lambda函数,通过ctx.test_case.__self__获取当前测试实例,再通过__class__.t拿到对应类的变量值。
方案二:简化实现(无需@given)
如果只是测试固定类变量的继承关系,可直接在方法内获取当前类的t,无需通过@given传递参数:
from hypothesis import given, strategies as st class TestInt: t = int def test_subclass(self): assert issubclass(self.__class__.t, int) class TestBool(TestInt): t = bool
self.__class__会指向当前实例所属的类,子类运行时自然会使用TestBool.t的值。
内容的提问来源于stack exchange,提问作者syvlorg
相关产品推荐
相关产品推荐

