5 min Lesezeit 04. Okt. 2026

Python pytest Unit Test: So schreibst du Unit Tests in Python

Unit Tests mit pytest: In diesem Tutorial lernst du, wie du deine Python-Funktionen mit pytest testest – Schritt für Schritt erklärt.

Marcel Schmidtpeter Von Marcel Schmidtpeter 04. Okt. 2026
Python pytest Unit Test: So schreibst du Unit Tests in Python

Du hast eine Funktion geschrieben, gibst zwei Werte in der Konsole ein, alles sieht gut aus - und drei Tage später fliegt sie dir wegen eines Edge Cases um die Ohren. Genau dafür gibt es Unit Tests: kleine, automatisierte Checks, die du jederzeit mit einem Befehl ausführen kannst. Und die gute Nachricht: Dein erster Python pytest Unit Test ist schneller geschrieben, als du denkst. Ob in der IHK-Abschlussprüfung, im Studium oder im ersten Job - wer Unit Tests schreiben kann, wirkt sofort professioneller.

In diesem Artikel lernst du, wie du pytest installierst, deinen ersten Unit Test schreibst, mehrere Testfälle mit einer Zeile abdeckst und sogar Exceptions testest. Am Ende hast du ein kleines, lauffähiges Testprojekt.

Voraussetzungen: Das brauchst du

Bevor du loslegst, check kurz diese drei Dinge:

  • Python 3 ist installiert (kostenlos auf python.org)

  • pip funktioniert - das ist Pythons Paketmanager für die Kommandozeile

  • Du kennst Funktionen in Python (Parameter, `return`) und kannst ein Terminal öffnen

Mehr nicht. pytest bringt alles andere selbst mit.

Was ist ein Unit Test - und warum ausgerechnet pytest?

Ein Unit Test ist ein kleiner, automatisierter Test, der genau eine isolierte Einheit deines Codes prüft - typischerweise eine einzelne Funktion. Stell dir vor, du kochst für Gäste: Statt nur am fertigen Teller zu probieren, schmeckst du jede Zutat einzeln ab. So findest du den Fehler sofort dort, wo er entsteht.

pytest ist ein Open-Source-Test-Framework für Python und der De-facto-Standard in der Praxis. Warum? Weil es extrem wenig Schreibarbeit braucht - ein einfaches `assert` reicht.

Kriterium

pytest

unittest

Installation

per pip nachrüsten

in Python eingebaut

Behauptungen

einfaches `assert`

`self.assertEqual()` und ähnliche Methoden

Boilerplate

sehr wenig

mehr, Klassen nötig

Testdaten

`@pytest.mark.parametrize`

`subTest` (umständlicher)

unittest ist Pythons eingebaute Alternative (Doku: docs.python.org/3/library/unittest.html). Für den Einstieg und im Berufsalltag ist pytest aber deutlich angenehmer.

Merke: Ein Unit Test prüft eine einzelne Funktion in Isolation - nicht das ganze Programm auf einmal.

Schritt 1: pytest installieren

pytest installierst du mit pip über das Terminal:

bash
pip install pytest

Kurz prüfen, ob alles geklappt hat:

bash
pytest --version

Wenn eine Versionsnummer erscheint, bist du startklar.

Schritt 2: Die Funktion schreiben, die du testen willst

Tests brauchen Code zum Testen. Lege dir einen Projektordner an und erstelle darin die Datei `rechner.py`:

python
# rechner.py


def netto_zu_brutto(netto, steuersatz):
    """Rechnet einen Nettopreis in einen Bruttopreis um."""
    return round(netto * (1 + steuersatz / 100), 2)


def berechne_rabatt(preis, rabatt_prozent):
    """Zieht einen Rabatt in Prozent vom Preis ab."""
    if rabatt_prozent < 0 or rabatt_prozent > 100:
        raise ValueError("Rabatt muss zwischen 0 und 100 liegen")
    return round(preis * (1 - rabatt_prozent / 100), 2)

Zwei typische Business-Funktionen: eine rechnet Umsatzsteuer drauf, eine rechnet Rabatt ab. Die zweite wirft bei Unsinn-Eingaben wie 150 % Rabatt bewusst einen `ValueError` - das testen wir später. Wie das Werfen von Exceptions genau funktioniert, habe ich im Artikel zu Python Exception Handling erklärt.

Schritt 3: Deinen ersten Unit Test schreiben

Ein Test in pytest ist eine ganz normale Funktion - pytest erkennt sie allein am Namen. Erstelle die Datei `test_rechner.py` im selben Ordner:

python
# test_rechner.py
from rechner import netto_zu_brutto


def test_netto_zu_brutto_mit_19_prozent():
    assert netto_zu_brutto(100, 19) == 119

Das `assert`-Statement ist eine Behauptung: "Ich behaupte, dass hier 119 herauskommt." Stimmt das, läuft der Test durch. Stimmt es nicht, wirft Python einen `AssertionError` und pytest meldet den Test als fehlgeschlagen.

Merke: pytest findet deine Tests automatisch - Dateien müssen mit `test_` beginnen (z. B. `test_rechner.py`) und Funktionen genauso (z. B. `test_netto_zu_brutto_mit_19_prozent`).

Schritt 4: Tests ausführen und die Ausgabe verstehen

Alle Tests in deinem Ordner führst du mit einem einzigen Befehl aus. Öffne das Terminal in deinem Projektordner und tippe:

bash
pytest

Du siehst ungefähr das hier:

bash
================= test session starts =================
collected 1 item

test_rechner.py .                                [100%]

============== 1 passed in 0.02s ==============

Der Punkt steht für einen bestandenen Test, `1 passed` bestätigt es. Mit `pytest -v` bekommst du zusätzlich den Namen jedes einzelnen Tests angezeigt - praktisch, sobald du mehr davon hast.

Schritt 5: Mehrere Fälle abdecken mit parametrize

Ein Testfall pro Funktion reicht nicht - du willst auch Grenzfälle wie Steuersatz 0 prüfen. Statt copy-paste zu spielen, nutzt du den Decorator `@pytest.mark.parametrize`:

python
import pytest
from rechner import netto_zu_brutto


@pytest.mark.parametrize(
    "netto, steuersatz, erwartet",
    [
        (100, 19, 119.0),
        (50, 7, 53.5),
        (0, 19, 0),
        (33.33, 19, 39.66),
    ],
)
def test_netto_zu_brutto_viele_faelle(netto, steuersatz, erwartet):
    assert netto_zu_brutto(netto, steuersatz) == erwartet

pytest erzeugt daraus automatisch vier einzelne Tests - einer pro Zeile in der Liste. Fällt einer durch, siehst du sofort, welche Eingabe das Problem verursacht. Decoratoren generell habe ich im Beitrag zu Python Decorators aufgeschlüsselt.

Merke: `@pytest.mark.parametrize` erzeugt aus einer Testfunktion automatisch einen Test pro Datenzeile - inklusive Grenzfällen.

Schritt 6: Exceptions testen mit pytest.raises

Auch Fehlerverhalten gehört getestet. Dafür gibt es `pytest.raises`:

python
def test_berechne_rabatt_ungueltiger_wert():
    with pytest.raises(ValueError):
        berechne_rabatt(100, 150)

Der `with`-Block behauptet: "Innerhalb dieses Blocks muss ein `ValueError` fliegen." Passiert das nicht, schlägt der Test fehl. So stellst du sicher, dass deine Validierung nicht versehentlich verschwindet.

Vollständiges Beispiel: Alles zusammen

Dein Projektordner sieht jetzt so aus:

text
mein_projekt/
  rechner.py
  test_rechner.py

Die komplette Testdatei:

python
# test_rechner.py
import pytest
from rechner import netto_zu_brutto, berechne_rabatt


def test_netto_zu_brutto_mit_19_prozent():
    assert netto_zu_brutto(100, 19) == 119


@pytest.mark.parametrize(
    "netto, steuersatz, erwartet",
    [
        (100, 19, 119.0),
        (50, 7, 53.5),
        (0, 19, 0),
        (33.33, 19, 39.66),
    ],
)
def test_netto_zu_brutto_viele_faelle(netto, steuersatz, erwartet):
    assert netto_zu_brutto(netto, steuersatz) == erwartet


def test_berechne_rabatt_ungueltiger_wert():
    with pytest.raises(ValueError):
        berechne_rabatt(100, 150)

Ausführen und freuen:

bash
$ pytest
============== 6 passed in 0.03s ==============

Sechs grüne Tests - und zwar jedes Mal auf Knopfdruck, nicht nur einmal von Hand.

Häufige Probleme & Lösungen

pytest läuft meistens auf Anhieb - aber diese drei Stolpersteine triffst du früher oder später.

Warum kommt "pytest: command not found"?

pytest ist installiert, aber das Terminal findet den Befehl nicht. Häufig ist das ein PATH-Problem. Nimm den sicheren Umweg über Python selbst:

bash
python -m pytest

Damit startest du pytest als Modul - das funktioniert fast immer.

Warum findet pytest meine Tests nicht ("collected 0 items")?

Meist ein Namensproblem: pytest sammelt nur Dateien mit Muster `test_*.py` oder `*_test.py` und Funktionen, die mit `test_` beginnen. Deine Datei heißt `RechnerTest.py`? Wird ignoriert. Benenne sie um, dann klappt es.

Warum schlagen Vergleiche mit Kommazahlen fehl?

Das hier überrascht jeden irgendwann:

python
assert 0.1 + 0.2 == 0.3  # schlaegt fehl!

Der Grund: Python speichert Floats binär, und 0.1 + 0.2 ergibt 0.30000000000000004. Die Lösung ist `pytest.approx` (Doku: docs.pytest.org):

python
def test_mit_kommazahlen():
    assert 0.1 + 0.2 == pytest.approx(0.3)

Merke: Floats vergleichst du in Tests nie mit `==`, sondern mit `pytest.approx`.

FAQ: Häufige Fragen zum Python pytest Unit Test

Was ist der Unterschied zwischen pytest und unittest?

unittest gehört zu Python und erzwingt Klassen mit Methoden wie `self.assertEqual()`. pytest nutzt einfache Funktionen und das normale `assert`, braucht dafür aber eine Installation per pip. Für Einsteiger und im Berufsalltag ist pytest die verbreitetere Wahl.

Wie viele Tests brauche ich pro Funktion?

Faustregel: mindestens ein Normalfall, die Grenzfälle (z. B. 0, leere Liste) und die Fehlerfälle. Bei `netto_zu_brutto` also 19 % Standard, 0 % Grenzfall - und bei Funktionen mit Validierung zusätzlich der Exception-Test.

Muss ich für pytest eine Klasse schreiben?

Nein. Eine einfache Funktion, die mit `test_` beginnt, reicht völlig. Klassen sind optional und lohnen sich erst, wenn du Testgruppen mit gemeinsamen Hilfsmitteln bündeln willst.

Ersetzen Unit Tests manuelles Testen?

Nein. Unit Tests prüfen einzelne Bausteine isoliert - ob das Gesamtprogramm zusammenspielt, prüfen erst Integrations- und Systemtests. Logikfehler in einzelnen Funktionen findest du mit einer guten Unit-Test-Suite aber zuverlässig und automatisiert.

Fazit

Ein Python pytest Unit Test ist kein Hexenwerk: Funktion schreiben, `test_`-Datei anlegen, `assert` rein, `pytest` starten. Mit `parametrize` deckst du viele Fälle kompakt ab, mit `pytest.raises` sicherst du Fehlerbehandlung ab. Ja, Tests schreiben kostet anfangs Zeit - aber diese Investigung zahlt sich beim ersten Refactoring zurück, wenn du mit einem Befehl weißt, dass nichts kaputtgegangen ist. Die offizielle Dokumentation mit allen Details findest du auf docs.pytest.org.

Wenn du bei Python, pytest oder einem anderen IT-Thema festhängst - ob für die nächste IHK-Prüfung, eine Uni-Hausaufgabe oder den Berufseinstieg - wir von study-it.education unterstützen dich mit persönlicher Nachhilfe. Schau vorbei und vereinbare deine erste Stunde.


Passende Nachhilfe

1:1-Hilfe zu diesem Thema?

Erstgespräch · 0 € · 30 min

Brauchst du jemand, der das mit dir durchgeht?

Statt nochmal lesen: 30 min mit einem Senior-Dev.

Kostenloses Erstgespräch buchen →
Über den Autor
Marcel Schmidtpeter
Marcel Schmidtpeter

Unit Tests mit pytest: In diesem Tutorial lernst du, wie du deine Python-Funktionen mit pytest testest – Schritt für Schritt erklärt.

marcel.schmidtpeter@study-it.education →
Weiterlesen

Mehr Lesestoff