这是我第一次尝试将 Hypothesis 与 Django 一起使用。
对于只能共享代码片段,我提前道歉。这是一个扩展代码库的一小部分。
我有一个模型(在许多其他领域中)有一个 1:1 的外部参考:
class Widget(models.Model):
external_id = models.IntegerField(null=False, unique=True, db_index=True)
我正在尝试制定一个策略来生成这些小部件。我尝试过的几乎所有事情都以“hypothesis.errors.Flaky:不一致的数据生成!不同运行之间的数据生成行为不同。您的数据生成是否取决于外部状态?”
这是一个相当复杂的测试的一部分,它构建了一个相当复杂的相互关联的模型树。在这个特定模型中将故障缩小到这个特定领域需要相当多的时间。实际的异常发生在假设.internal.conjecture.ConjectureData 实例self.observer.conclude_test()
从其.freeze()
方法内部调用时。在某些变体中,调用堆栈包含一个与我的 @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))
问题:
- 为该领域定义策略的好方法是什么?
- 为了将来参考,有没有一种很好的方法,没有反复试验,可以判断哪个属性的哪个字段失败?
谢谢你。