【问题标题】:How to generate test samples with Hypothesis directly from dataclasses?如何直接从数据类生成带有假设的测试样本?
【发布时间】:2022-01-20 13:29:24
【问题描述】:

我可以说两个数据类,其中一个在另一个内部使用,如下所示:

@dataclass(frozen=True)
class SensorModel:
    sensor_id: int
    type: str 
    health_status: bool 

@dataclass
class SamplingModel:
    trigger: str
    priority: str = field(init=False)
    time: datetime
    sensors: List[SensorModel]

我如何使用假设来生成我的测试样本?

我在文档中发现假设策略原生支持数据类hypothesis,但没有任何示例说明如何在描述的简单案例中做到这一点。

【问题讨论】:

    标签: python automated-tests python-dataclasses python-hypothesis


    【解决方案1】:

    好的,我找到了答案,事实证明它真的很简单,你可以使用from_type 生成器from_type documentation

    在我上面描述的简单示例中,可以执行类似的操作

    @dataclass(frozen=True)
    class SensorModel:
        sensor_id: int
        type: str 
        health_status: bool 
    
    @dataclass
    class SamplingModel:
        trigger: str
        priority: str = field(init=False)
        time: datetime
        sensors: List[SensorModel]
    
    @given(sample=gen.from_type(SamplingModel))
    def test_samples(sample):
        assert sample.trigger == sample.trigger #point-less test replace with your logic
    

    【讨论】:

    • 是的,就是这样!我还建议检查builds() 策略,它允许您为某些参数传递显式策略,例如time 必须在 unix 纪元之后。
    • @ZacHatfield-Dodds 好的,我知道你是假设的开发者,这是一个独特的机会来问你。以上工作,但我们可以使用更具体的生成器与数据类,而不必手动复制数据类的整个嵌套结构?例如,假设我们有 3 个嵌套的数据类,并且我们想要更具体的字符串生成器或列表生成器,而不仅仅是默认的。我们怎么能做到呢?或者我们可以在数据类本身中添加一些东西来告诉假设使用更具体的生成器吗?
    • 您可以为您的自定义类型注册一个策略,然后 wgich 将被以后使用 builds() 和 from_type() 拾取 - 请参阅hypothesis.readthedocs.io/en/latest/…
    • 好吧好吧,所以也许我可以为我们的自定义类型创建一个包含所有策略的模块,并将它们导入到我们需要它们的任何地方并在那里注册它们。这样,如果需要,我们也可以在不同的情况下为相同的数据类制定不同的策略。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2018-09-09
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2017-04-17
    • 2023-04-08
    相关资源
    最近更新 更多