我有
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):
...
答案 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):
...
希望有所帮助: - )