Пример использования стратегий, возвращающих экземпляры классов

у меня есть

class A(st.SearchStrategy):
  def do_draw(self, data):
     return object_a(b=st.integers(), c=st.boolean()...)

class B(st.SearchStrategy):
  def do_draw(self, data):
     return object_a(d=st.boolean(), e=st.boolean()...)

@given(a=A(), b=B())
def test_A_and_B(a, b):
  ...

Как я могу убедиться, что тестовый пример

a = A(b=5, c=True)
# b can be anything

и тестовый пример

a = A(b=10, c=True)
b = B(c=True, d=<can be either T or F>)

получить сгенерировать?

Я знаю про @example. Было бы это правильно?

@given(a=A(), b=B())
@example(a=A(b=10, c=True), b=B(c=True, d=False)
# not sure how to set d to be either true or false
def test_A_and_B(a, b):
  ...

person curious_george    schedule 13.04.2018    source источник


Ответы (1)


НЕ НАСЛЕДУЙТЕ ИЗ ПОИСКОВОЙ СТРАТЕГИИ.
Это частный внутренний код, который мы можем изменить в любое время. Вы все равно неправильно его используете!

Вместо этого вы должны составить свою стратегию из документированных функций в hypothesis.strategies. Например, вы можете определить стратегию создания экземпляров object_a, используя builds() вот так:

builds(object_a, b=st.integers(), c=st.booleans(), ...)

@example - это единственный точный ввод, поэтому вы должны использовать его дважды, чтобы проверить d как True, так и False:

@example(a=object_a(b=10, c=True), b=object_b(c=True, d=True)
@example(a=object_a(b=10, c=True), b=object_b(c=True, d=False)

Если вас вообще не интересует значение b, просто определите пример со значением по умолчанию для этого аргумента.

Все вместе это будет выглядеть так:

@given(
    a=builds(object_a, b=st.integers(), c=st.booleans()), 
    b=builds(object_b, d=st.booleans(), e=st.booleans()
)
@example(a=object_a(b=5, c=True), b=None)  # assuming b=None is valid
@example(a=object_a(b=10, c=True), b=object_b(d=True, e=True))
@example(a=object_a(b=10, c=True), b=object_b(d=True, e=False))
def test_A_and_B(a, b):
    ...

Надеюсь, это поможет :-)

person Zac Hatfield-Dodds    schedule 15.04.2018