I had a moment of weakness this morning and did some feature development on Hypothesis despite promising not to. The result is Hypothesis 1.14.0.
This adds a bunch of interesting new strategies to the list. One I’d like to talk about in particular is the new choices strategy.
What does it do?ell, it gives you something that behaves like random.choice only under Hypothesis’s control and subject to minimization. This more or less solves the problem I had a long and complicated post about a while ago for picking elements from a list. You can now do something like:
from hypothesis import given, strategies as st @given(st.lists(st.integers(), min_size=1), st.choices()) def test_deletion(values, choice): v = choice(values) values.remove(v) assert v not in values |
Then running this will print something like:
_____________________________________________ test_deletion ______________________________________________ test_del.py:4: in test_deletion def test_deletion(values, choice): src/hypothesis/core.py:583: in wrapped_test print_example=True, is_final=True src/hypothesis/executors/executors.py:25: in default_executor return function() src/hypothesis/core.py:365: in run return test(*args, **kwargs) test_del.py:7: in test_deletion assert v not in values E assert 0 not in [0] ----------------------------------------------- Hypothesis ----------------------------------------------- Falsifying example: test_deletion(values=[0, 0], choice=choice) Choice #1: 0 ===================
Note that the choices are printed as they are made. This was one of the major obstacles to implementing something like this in the past: The lack of the ability to display the results from within the test. The new note API offers a solution to this.