【问题标题】:Hypothesis, django, and generating external IDs假设、django 和生成外部 ID
【发布时间】:2019-11-07 17:20:09
【问题描述】:

这是我第一次尝试在 Django 中使用 Hypothesis。

对于只能共享代码 sn-ps,我提前道歉。这是一个庞大的代码库中的一小部分。

我有一个带有(在许多其他领域中)1:1 外部参考的模型:

class Widget(models.Model):
   external_id = models.IntegerField(null=False, unique=True, db_index=True)

我正在尝试制定一个策略来生成这些小部件。我尝试过的几乎所有事情都以“hypothesis.errors.Flaky:不一致的数据生成!不同运行之间的数据生成行为不同。您的数据生成是否取决于外部状态?”

这是一个相当复杂的测试的一部分,它构建了一个相当复杂的相互关联的模型树。在这个特定模型中将故障缩小到这个特定领域需要相当多的时间。实际异常发生在假设.internal.conjecture.ConjectureData 实例从其.freeze() 方法内部调用self.observer.conclude_test() 时。在某些变体中,调用堆栈包含一个与我的@given 参数匹配的元组,但从那里到正在生成的特定模型(更不用说字段)的转换没有任何似乎对诊断有用的状态。

我正在尝试的基本想法是:

import hypothesis.extra.django as hy_dj
import hypothesis.strategies as st

@st.composite
def Strategy(draw):
   return draw(hy_dj.from_model(Widget),

删除字段的unique=True 约束允许测试通过,但它破坏了我们的基本假设之一。

指定external_id=st.just(1) 无法生成有效示例。

我尝试的所有其他方法都因一致性错误而失败。

  • st.just(1)
  • st.just(random.randint(MAX_INT32))
  • st.sampled_from(range(1,1000))

问题:

  1. 为该领域定义策略的好方法是什么?
  2. 供以后参考,有没有好的方法,没有反复试验,告诉 哪个属性的哪个字段失败了?

谢谢。

【问题讨论】:

    标签: python-hypothesis


    【解决方案1】:

    在看不到任何代码的情况下,我最好的猜测是您没有在假设示例之间重置数据库 - 所以从假设的角度来看,测试 不稳定,因为后续运行反对肮脏的数据库。

    加号:

    @st.composite
    def Strategy(draw):
       return draw(hy_dj.from_model(Widget))
    
    # is exactly equivalent to
    def Strategy():
        return hy_dj.from_model(Widget)
    

    【讨论】:

      猜你喜欢
      • 2019-08-24
      • 1970-01-01
      • 2021-01-23
      • 2021-02-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      相关资源
      最近更新 更多