Unit-Tests schreiben mit pytest

Tests geben dir Sicherheit beim Programmieren. In diesem Beitrag lernst du, wie du mit pytest schnell und elegant Unit-Tests für deinen Python-Code schreibst.

Teilen
Unit-Tests schreiben mit pytest

Hast du schon einmal eine kleine Änderung gemacht und damit unbemerkt eine andere Stelle im Code kaputt gemacht? Genau dagegen helfen Tests. Sie prüfen automatisch, ob dein Code das tut, was er soll. In der Python-Welt ist pytest das beliebteste Werkzeug dafür, weil es einfach zu bedienen und trotzdem mächtig ist. In diesem Beitrag schreiben wir gemeinsam unsere ersten Tests.

Warum überhaupt testen?

Tests sind kein lästiges Extra, sondern ein echter Gewinn. Sie geben dir Sicherheit, dass dein Code funktioniert, und zwar auch nach Änderungen. Die wichtigsten Vorteile auf einen Blick:

  • Du findest Fehler früh, bevor sie im Produktivbetrieb auffallen.
  • Du kannst Code beruhigt umbauen, weil die Tests dich warnen.
  • Tests dienen nebenbei als Dokumentation, wie dein Code gedacht ist.

Gerade als Lernende lohnt es sich, früh ein Gefühl für Tests zu bekommen. pytest macht den Einstieg leicht.

pytest installieren

pytest gehört nicht zur Standardbibliothek, ist aber schnell installiert. Danach steht dir der Befehl pytest direkt in der Kommandozeile zur Verfügung.

pip install pytest
pytest --version

Mehr brauchst du nicht, um loszulegen. pytest findet deine Tests automatisch anhand der Namensgebung.

Der erste Test

Angenommen, du hast eine einfache Funktion, die zwei Zahlen addiert. Einen Test dafür schreibst du als ganz normale Funktion, deren Name mit test_ beginnt. Mit dem Schlüsselwort assert prüfst du, ob das Ergebnis stimmt.

# datei: rechner.py
def addiere(a, b):
    return a + b
# datei: test_rechner.py
from rechner import addiere

def test_addiere():
    assert addiere(2, 3) == 5
    assert addiere(-1, 1) == 0

Den Test startest du, indem du in der Kommandozeile einfach pytest eingibst. pytest sucht selbstständig alle Dateien, die mit test_ beginnen, und führt die enthaltenen Testfunktionen aus.

Mehrere Fälle mit Parametern testen

Oft willst du dieselbe Funktion mit vielen verschiedenen Eingaben prüfen. Statt den Code zu kopieren, nutzt du @pytest.mark.parametrize. So testest du viele Fälle kompakt in einer einzigen Funktion.

import pytest
from rechner import addiere

@pytest.mark.parametrize("a, b, erwartet", [
    (2, 3, 5),
    (0, 0, 0),
    (-2, -3, -5),
    (100, 1, 101),
])
def test_addiere_viele(a, b, erwartet):
    assert addiere(a, b) == erwartet

pytest führt den Test nun einmal pro Zeile aus. Schlägt einer der Fälle fehl, zeigt dir pytest genau, welche Werte das Problem verursacht haben.

Auf Ausnahmen testen

Manchmal soll deine Funktion bewusst einen Fehler auslösen, etwa bei einer ungültigen Eingabe. Auch das kannst du testen, und zwar mit dem Kontextmanager pytest.raises.

import pytest

def teile(a, b):
    if b == 0:
        raise ValueError("Division durch null ist nicht erlaubt")
    return a / b

def test_teile_durch_null():
    with pytest.raises(ValueError):
        teile(10, 0)

Der Test gilt als bestanden, wenn die erwartete Ausnahme tatsächlich ausgelöst wird. So stellst du sicher, dass deine Fehlerbehandlung wie geplant greift.

Fixtures für wiederkehrende Vorbereitungen

Wenn mehrere Tests dieselben Vorbereitungen brauchen, etwa ein bestimmtes Beispielobjekt, helfen Fixtures. Eine Fixture ist eine Funktion mit dem Dekorator @pytest.fixture, deren Rückgabewert du als Parameter in deine Tests bekommst.

import pytest

@pytest.fixture
def beispiel_liste():
    return [1, 2, 3, 4]

def test_summe(beispiel_liste):
    assert sum(beispiel_liste) == 10

def test_laenge(beispiel_liste):
    assert len(beispiel_liste) == 4

So vermeidest du Wiederholungen und hältst deine Tests übersichtlich. pytest kümmert sich automatisch darum, die Fixture für jeden Test bereitzustellen.

Fazit

Mit pytest sind Unit-Tests in Python schnell geschrieben und leicht zu lesen. Du hast gelernt, wie ein einfacher Test mit assert aussieht, wie du mit parametrize viele Fälle abdeckst, mit pytest.raises Ausnahmen prüfst und mit Fixtures Wiederholungen vermeidest. Tests geben dir die Freiheit, deinen Code mutig zu verbessern, ohne ständig Angst vor neuen Fehlern zu haben. Fang am besten klein an: Schreibe für deine nächste Funktion direkt einen Test mit. Du wirst den Sicherheitsgewinn schnell zu schätzen wissen.