2

这是我第一次尝试将 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))

问题:

  1. 为该领域定义策略的好方法是什么?
  2. 为了将来参考,有没有一种很好的方法,没有反复试验,可以判断哪个属性的哪个字段失败?

谢谢你。

4

1 回答 1

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-11-13T02:11:25.970 回答