You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:42:40