EMZETT.
Login

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) == -2

Start 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 / 0

Ein 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), hypothesis für Property-Based Testing.

Siehe auch: Unit-Test, Mocking und Test-Doubles, Code-Abdeckung, Property-Based Testing