【发布时间】: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))
问题:
- 为该领域定义策略的好方法是什么?
- 供以后参考,有没有好的方法,没有反复试验,告诉 哪个属性的哪个字段失败了?
谢谢。
【问题讨论】: