0

我有

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

1 回答 1

2

不要继承自搜索策略。
它是私有的内部代码,我们可能随时更改。反正你用错了!

相反,您应该. hypothesis.strategies例如,您可以定义一个策略来制作object_ausing的实例,builds()如下所示:

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

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

希望有帮助:-)

于 2018-04-15T03:03:00.020 回答