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.
By Marcel Schmidtpeter 04 Oct 2026
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:
pip install pytestKurz prüfen, ob alles geklappt hat:
pytest --versionWenn 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`:
# 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:
# test_rechner.py
from rechner import netto_zu_brutto
def test_netto_zu_brutto_mit_19_prozent():
assert netto_zu_brutto(100, 19) == 119Das `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:
pytestDu siehst ungefähr das hier:
================= 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`:
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) == erwartetpytest 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`:
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:
mein_projekt/
rechner.py
test_rechner.pyDie komplette Testdatei:
# 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:
$ 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:
python -m pytestDamit 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:
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):
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.
Need someone to walk through this with you?
Instead of re-reading: 30 min with a senior dev.
Book a free first chat →
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 →More reading
Python HTTP requests senden: GET, POST & mehr mit requests
So sendest du mit der Python-Bibliothek requests GET- und POST-Anfragen an APIs – mit Beispielen für Azubis, Studenten und Berufseinsteiger.
Python JSON verarbeiten mit dem -Modul – einfach erklärt
JSON in Python lesen und schreiben? Das -Modul macht's einfach – von .loads bis .dumps, hier lernst du alles Wichtige.
Python Datenbank verbinden: sqlite3 & SQLAlchemy einfach erklärt
Erfahre, wie du Python per sqlite3 oder SQLAlchemy mit Datenbanken verbindest – mit Praxisbeispielen für Azubis, Studenten & Berufseinsteiger.