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 Auch in der Bibliothek
Supertest für JavaScript (Node.js): Komplettguide mit Beispielen
Cheerio für JavaScript (Node.js): Komplettguide mit Beispielen
Reaktive Programmierung in Swift: Combine und RxSwift für iOS/macOS
HTTP-Client für Go (Golang): Top-Bibliotheken für die Arbeit mit HTTP
Symfony/Cache für PHP: Komplette Anleitung mit Beispielen