使用示例返回返回类实例的策略

时间:2018-04-13 23:45:50

标签: python-hypothesis

我有

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):
  ...

1 个答案:

答案 0 :(得分:2)

  

请勿继续搜索。
  它是我们可能随时更改的私有内部代码。你无论如何都错了!

相反,您应该从hypothesis.strategies中的documented functions撰写策略。例如,您可以定义一个策略,使用builds()制作object_a的实例,如下所示:

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

@example是一个确切的输入,所以你要两次使用它来检查d的真和假:

@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):
    ...

希望有所帮助: - )