Гипотеза, django и генерация внешних идентификаторов - PullRequest
0 голосов
/ 07 ноября 2019

Я впервые пытаюсь использовать Гипотезу с 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))

Вопросы:

  1. Как правильно определить стратегию для этого поля?
  2. Для дальнейшего использованияЕсть хороший способ, если не считать проб и ошибок, чтобы узнать, какое поле из какого свойства не удалось?

Спасибо.

1 Ответ

0 голосов
/ 13 ноября 2019

Мое лучшее предположение, не имея возможности увидеть какой-либо ваш код, состоит в том, что вы не сбрасываете БД между примерами гипотез - поэтому тест является ненадежным с точки зрения гипотезы, поскольку последующие прогоныпротив грязной БД.

Plus:

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

# is exactly equivalent to
def Strategy():
    return hy_dj.from_model(Widget)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...