Hypothesis

Hypothesis ist eine Bibliothek, mit der ihr Tests schreiben könnt, die anhand einer Quelle von Beispielen parametrisiert werden. Anschließend werden einfache und nachvollziehbare Beispiele generiert, anhand derer eure Tests fehlschlagen können und ihr mit geringen Aufwänden Fehler finden könnt.

Beispiel

Zum Testen von Listen mit Fließkommazahlen werden viele Beispiele ausprobiert, jedoch im Report nur ein einfaches Beispiel für jeden Bug (eindeutiger exception type und Position) angegeben:

[1]:
from hypothesis import given
from hypothesis.strategies import lists, floats
[2]:
# Add ipython magics
import ipytest
import pytest


ipytest.autoconfig()
[3]:
%%ipytest

@given(lists(floats(allow_nan=False, allow_infinity=False), min_size=1))
def test_mean(ls):
    mean = sum(ls) / len(ls)
    assert min(ls) <= mean <= max(ls)
F                                                                                            [100%]
============================================= FAILURES =============================================
____________________________________________ test_mean _____________________________________________

    @given(lists(floats(allow_nan=False, allow_infinity=False), min_size=1))
>   def test_mean(ls):

/var/folders/hk/s8m0bblj0g10hw885gld52mc0000gn/T/ipykernel_37502/1742712940.py:2:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

ls = [1.922532935891866e+307, 1.797693134860272e+308]

    @given(lists(floats(allow_nan=False, allow_infinity=False), min_size=1))
    def test_mean(ls):
        mean = sum(ls) / len(ls)
>       assert min(ls) <= mean <= max(ls)
E       assert inf <= 1.797693134860272e+308
E        +  where 1.797693134860272e+308 = max([1.922532935891866e+307, 1.797693134860272e+308])
E       Falsifying example: test_mean(
E           ls=[1.922532935891866e+307, 1.797693134860272e+308],
E       )

/var/folders/hk/s8m0bblj0g10hw885gld52mc0000gn/T/ipykernel_37502/1742712940.py:4: AssertionError
========================================= warnings summary =========================================
../../../../../../.local/share/virtualenvs/python-311-6zxVKbDJ/lib/python3.11/site-packages/_pytest/config/__init__.py:1204
  /srv/jupyter/.local/share/virtualenvs/python-311-6zxVKbDJ/lib/python3.11/site-packages/_pytest/config/__init__.py:1204: PytestAssertRewriteWarning: Module already imported so cannot be rewritten: hypothesis
    self._mark_plugins_for_rewrite(hook)

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
===================================== short test summary info ======================================
FAILED t_c7729a99e261490d9a679829703295f9.py::test_mean - assert inf <= 1.797693134860272e+308
1 failed, 1 warning in 2.14s

Installation

$ pipenv install hypothesis

Alternativ kann Hypothesis auch mit Erweiterungen installiert werden, z.B.:

$ pipenv install hypothesis[numpy,pandas]

Bemerkung:

Falls ihr pipenv noch nicht installiert habt, findet ihr eine Anleitung hierzu unter Jupyter Notebook installieren.