Hypothesis – Generatives Testen in Python

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung

Herkömmliche Tests prüfen, ob eine Funktion mit bestimmten Werten korrekt arbeitet. Doch was, wenn Sie nicht im Voraus wissen, welche Eingabedaten zu einem Fehler führen? Hypothesis – generatives Testen löst dieses Problem automatisch.

Hypothesis ist eine leistungsstarke Bibliothek für Property-based Testing in Python, die den Ansatz zum Testen grundlegend verändert. Anstatt Testdaten manuell zu erstellen, generiert sie automatisch Tausende verschiedener Eingabewerte und sucht gezielt nach extremen, fehlerhaften oder ungewöhnlichen Fällen. Statt viele Tests mit konkreten Werten zu schreiben, beschreiben Sie die Eigenschaften und Invarianten einer Funktion – und Hypothesis versucht, diese zu verletzen.

Was ist Hypothesis?

Hypothesis ist ein Werkzeug für generatives Testen, das auf dem Konzept des Property-based Testing basiert. Die Bibliothek wurde entwickelt, um ein fundamentales Problem des traditionellen Testens zu lösen: die Unmöglichkeit, alle möglichen Eingabedaten vorherzusehen.

Grundlegende Funktionsweise

Die Bibliothek arbeitet nach dem Prinzip „Finde ein Gegenbeispiel". Wenn Sie eine Eigenschaft einer Funktion definieren (z. B. dass das Ergebnis der Addition zweier Zahlen immer größer ist als jeder der Summanden), generiert Hypothesis eine Vielzahl unterschiedlicher Eingabedaten und prüft, ob diese Eigenschaft für jeden Datensatz gilt.

Vorteile gegenüber traditionellem Testen

  • Automatische Abdeckung von Grenzfällen: Hypothesis findet selbstständig seltene und komplexe Datenkombinationen
  • Fehlerminimierung: Bei einem fehlschlagenden Test wird das Beispiel automatisch auf den minimalen Fall reduziert
  • Hohe Leistung: Die Generierung Tausender Testfälle erfolgt schnell
  • Reproduzierbarkeit: Gefundene Fehler lassen sich leicht reproduzieren

Installation und erste Schritte

Bibliothek installieren

pip install hypothesis

Für zusätzliche Funktionen kann die Installation mit Erweiterungen erfolgen:

pip install hypothesis[numpy,pandas,django]

Einfaches Anwendungsbeispiel

from hypothesis import given
import hypothesis.strategies as st

@given(st.integers(), st.integers())
def test_addition_commutative(a, b):
    assert a + b == b + a

@given(st.integers(), st.integers())
def test_addition_associative(a, b, c):
    assert (a + b) + c == a + (b + c)

Tests ausführen

Die Tests können über pytest, unittest oder direkt ausgeführt werden:

pytest test_file.py
python -m unittest test_file.py
python test_file.py

Grundlagen der Datengenerierung

Der @given-Dekorator

Der Dekorator @given() ist das zentrale Element von Hypothesis. Er gibt an, welche Generierungsstrategien für die Erstellung der Testdaten verwendet werden sollen.

@given(st.integers())
def test_absolute_value(x):
    assert abs(x) >= 0

@given(st.text(), st.integers(min_value=0))
def test_string_multiplication(s, n):
    result = s * n
    assert len(result) == len(s) * n

Das Modul hypothesis.strategies

Alle Strategien zur Datengenerierung befinden sich im Modul hypothesis.strategies, das üblicherweise als st importiert wird. Dieses Modul bietet eine umfangreiche Sammlung vordefinierter Strategien für verschiedene Datentypen.

Strategien zur Datengenerierung

Basisstrategien

Hypothesis stellt eine breite Palette integrierter Strategien zur Generierung verschiedener Datentypen bereit:

# Numerische Typen
st.integers()  # Ganze Zahlen
st.floats()    # Gleitkommazahlen
st.decimals()  # Dezimalzahlen

# Textdaten
st.text()      # Unicode-Zeichenketten
st.binary()    # Byte-Zeichenketten
st.characters() # Einzelne Zeichen

# Log                    

Empfehlungen