pytest: Tests in Python schreiben und ausführen
Kurz: pytest ist das beliebteste Test-Framework für Python: Tests sind einfache Funktionen mit assert, Fixtures liefern Testdaten, und die Fehlermeldungen sind aussagekräftig.
Genauer: Mit pytest schreibt man Tests ohne Klassen und ohne Boilerplate. Es findet Dateien test_*.py und Funktionen test_* automatisch. Installation: pip install pytest.
Im Detail
Ein einfacher Test
# rechnen.py
def addiere(a, b):
return a + b
# test_rechnen.py
from rechnen import addiere
def test_addiere_positive_zahlen():
assert addiere(2, 3) == 5
def test_addiere_negative_zahlen():
assert addiere(-1, -1) == -2Start mit pytest oder pytest -v (ausführlich), pytest -k addiere (nach Namen filtern), pytest -x (beim ersten Fehler stoppen). Bei Fehlschlag zeigt pytest die verglichenen Werte genau an.
Parametrisierte Tests und Ausnahmen
import pytest
@pytest.mark.parametrize("a, b, erwartet", [(1, 1, 2), (0, 0, 0), (-1, 1, 0)])
def test_addiere(a, b, erwartet):
assert addiere(a, b) == erwartet
def test_teilen_durch_null():
with pytest.raises(ZeroDivisionError):
1 / 0Ein Test, viele Datensätze: spart Code und deckt Randfälle ab.
Fixtures
@pytest.fixture
def nutzer():
return {"name": "Mia", "alter": 17}
def test_name(nutzer):
assert nutzer["name"] == "Mia"Fixtures stellen wiederverwendbare Testvorbereitung bereit (Datenbank, temporäre Dateien mit tmp_path, Test-Clients) und räumen danach mit yield auf. Gemeinsame Fixtures stehen in conftest.py. Mit monkeypatch und unittest.mock ersetzt man externe Abhängigkeiten.
Praxis
- Struktur: Ordner
tests/, Tests unabhängig voneinander, schnelle Unit-Tests zuerst. - Abdeckung messen:
pytest --cov=paket(Plugin pytest-cov). - Marker (
@pytest.mark.slow) trennen langsame Tests. - CI: pytest in GitHub Actions bei jedem Push ausführen.
- Ein Test soll eine Sache prüfen und aussagekräftig heißen. TDD (Test zuerst) hilft beim Design.
Alternativen:
unittest(in der Standardbibliothek),nose(veraltet),hypothesisfür Property-Based Testing.
Siehe auch: Unit-Test, Mocking und Test-Doubles, Code-Abdeckung, Property-Based Testing