I'm using hypothesis to test a function that takes two lists of equal length as input.
import hypothesis.strategies as st
from hypothesis import assume, given
@given(
st.lists(ints, min_size=1),
st.lists(ints, min_size=1),
)
def test_my_func(x, y):
assume(len(x) == len(y))
# Assertions
This gives me the error message:
FailedHealthCheck: It looks like your strategy is filtering out a lot of data. Health check found 50 filtered examples but only 4 good ones.
The assumption that len(x) == len(y)
is filtering out too many inputs. So I would like to generate a random positive number and use that as the length of both x
and y
. Is there a way this can be done?
You can use flatmap
to generate data that depends on other generated data.
import hypothesis.strategies as st
from hypothesis import assume, given
from hypothesis.strategies import integers as ints
same_len_lists = ints(min_value=1, max_value=100).flatmap(lambda n: st.lists(st.lists(ints(), min_size=n, max_size=n), min_size=2, max_size=2))
@given(same_len_lists)
def test_my_func(lists):
x, y = lists
assume(len(x) == len(y))
It's a little clumsy, and I'm not very happy about having to unpack the lists inside the test body.