Я впервые пытаюсь использовать Гипотезу с Django.
Заранее прошу прощения за возможность обмениваться фрагментами кода. Это очень маленький фрагмент обширной базы кода.
У меня есть Модель с (среди множества других полей) внешней ссылкой 1: 1:
class Widget(models.Model):
external_id = models.IntegerField(null=False, unique=True, db_index=True)
Я пытаюсьсоставить стратегию для генерации этих виджетов. Почти все, что я пробовал, терпит неудачу с «hypothesis.errors.Flaky: Несогласованная генерация данных! Генерация данных велась по-разному при разных запусках. Зависит ли ваша генерация данных от внешнего состояния?»
Это часть довольно сложноготест, который строит довольно сложное дерево взаимосвязанных моделей. Сужение ошибки до этой конкретной области в этой конкретной модели заняло довольно много времени. Фактическое исключение происходит, когда экземпляр hypothesis.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))
Вопросы:
- Как правильно определить стратегию для этого поля?
- Для дальнейшего использованияЕсть хороший способ, если не считать проб и ошибок, чтобы узнать, какое поле из какого свойства не удалось?
Спасибо.