Search code examples
pythontestingpython-hypothesis

Python hypothesis: Ensure that input lists have same length


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?


Solution

  • 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.