Unit-Test (Modultest)
Kurz: Ein Unit-Test prüft automatisch eine kleine, abgegrenzte Einheit des Programms (meist eine Funktion oder Klasse) auf korrektes Verhalten – schnell, isoliert und wiederholbar.
Genauer: Unit-Tests bilden die Basis der Testpyramide: viele schnelle Unit-Tests, weniger Integrationstests, wenige langsame End-to-End-Tests. Sie finden Fehler früh, dokumentieren das erwartete Verhalten und machen Refactoring sicher. In der CI/CD-Pipeline laufen sie bei jeder Änderung.
Im Detail
# rechnen.py
def rabatt(preis, prozent):
if not 0 <= prozent <= 100:
raise ValueError("Prozent muss zwischen 0 und 100 liegen")
return preis * (1 - prozent / 100)
# test_rechnen.py (pytest)
import pytest
from rechnen import rabatt
def test_zehn_prozent():
assert rabatt(200, 10) == 180
def test_null_prozent():
assert rabatt(50, 0) == 50
def test_ungueltiger_wert():
with pytest.raises(ValueError):
rabatt(100, 120)Aufbau: Arrange – Act – Assert
- Arrange: Testdaten und Objekte vorbereiten.
- Act: die zu testende Funktion aufrufen.
- Assert: das Ergebnis prüfen.
Gute Unit-Tests sind …
- schnell (Millisekunden) und unabhängig voneinander
- deterministisch (kein Zufall, keine echte Uhrzeit, kein Netzwerk)
- aussagekräftig benannt (
test_ungueltiger_wert) - auf ein Verhalten konzentriert
Externe Abhängigkeiten ersetzt man durch Attrappen (Mocks, Stubs, Fakes), was durch Dependency Injection erleichtert wird. Frameworks: JUnit (Java), pytest (Python), Jest/Vitest (JavaScript), xUnit (C#), go test (Go), Cargo (Rust). Testen vor dem Programmieren beschreibt TDD.
Siehe auch: TDD, Refactoring, Debugging, CI/CD-Pipeline