PyTest Tutorial: Installieren, Tests schreiben und ausführen mit Vertrauen
Was ist PyTest?
PyTest ist ein mächtiges, Open-Source-Testing-Framework, das Entwicklern erlaubt, prägnante, skalierbare Testcases für Python-Projekte zu schreiben – seien es Unit-Tests, Integrationstests oder End-to-End-API-Checks. Es unterstützt parallele Ausführung, Fixture-Injection, Parametrisierung und reichhaltiges Reporting out of the box.
Warum PyTest wählen?
- Einfache, lesbare Syntax, die Boilerplate reduziert
- Automatische Test-Discovery und Ausführung
- Spezifische Tests oder Gruppen via
-kund Markern ausführen - Eingebauter Support für parallele Runs via
pytest-xdist - Erweiterbar durch Fixtures, Hooks und Plugins
- Kostenlos und aktiv von der Community gewartet
PyTest installieren
Neuestes stabiles Release mit pip installieren:
pip install pytest
Installation verifizieren:
pytest --version
Für spezifische Versionen können Sie pinnen, z. B. pip install pytest==7.4.0.
Erste Schritte: Ein Basis-Test
Projektverzeichnis erstellen und Testdatei test_sample1.py anlegen:
import pytest
def test_file1_method1():
x = 5
y = 6
assert x + 1 == y, "Addition failed"
assert x == y, "Values should match"
def test_file1_method2():
x = 5
y = 6
assert x + 1 == y, "Addition failed"
Test-Suite ausführen:
pytest
Output-Beispiel:
==================== test session starts ====================
collected 2 items
test_sample1.py F. [100%]
=================================== FAILURES ===================================
...
Assertions verstehen
PyTest-Assertions verhalten sich wie Standard-Python-assert-Statements. Bei Fehlschlag stoppt der Test und PyTest reportet exakte Position und Message:
assert "hello" == "Hai", "Mismatched greeting"
Test Discovery Rules
- Dateien müssen mit
test_beginnen oder mit_test.pyenden. - Test-Funktionen müssen mit
test_beginnen. - Andere Dateien/Funktionen werden ignoriert, außer explizit spezifiziert.
Spezifische Tests ausführen
Alle Tests in einem Verzeichnis:
pytest
Einzelne Datei:
pytest test_sample1.py
Nach Substring filtern:
pytest -k method1 -v
Nach Marker:
pytest -m set1
Parallele Ausführung
xdist Plugin installieren und 4-Worker-Parallel-Run starten:
pip install pytest-xdist pytest -n 4
Fixtures nutzen
Wiederverwendbares Setup-Logic einmal definieren und in Tests injizieren:
import pytest
@pytest.fixture
def supply_data():
return [25, 35, 45]
def test_compare_with_first(supply_data):
assert supply_data[0] == 25
Fixture-Code in conftest.py platzieren, um über mehrere Test-Module zu teilen.
Parametrisierte Tests
Einen Test mit vielen Inputs ausführen:
import pytest
@pytest.mark.parametrize("a, b, expected", [(5, 5, 10), (3, 5, 8)])
def test_add(a, b, expected):
assert a + b == expected
Tests skippen und Expected Failures
Marker nutzen, um Tests zu skippen oder Failures zu erwarten, ohne Results zu verschmutzen:
import pytest
@pytest.mark.skip(reason="Feature not yet available")
def test_future_feature():
pass
@pytest.mark.xfail(reason="Known bug")
def test_known_issue():
assert 1 == 2
XML Reports generieren
JUnit-kompatibles XML für CI-Pipelines erzeugen:
pytest -v --junitxml=result.xml
Praxisbeispiel: Public API testen
Unten ein minimales Framework, das https://reqres.in/ testet:
# conftest.py
import pytest
@pytest.fixture
def base_url():
return "https://reqres.in/api"
# test_list_user.py
import requests, json
import pytest
@pytest.mark.parametrize("user_id, first_name", [(1, "George"), (2, "Janet")])
def test_valid_user(base_url, user_id, first_name):
resp = requests.get(f"{base_url}/users/{user_id}")
data = json.loads(resp.text)
assert resp.status_code == 200
assert data["data"]["id"] == user_id
assert data["data"]["first_name"] == first_name
def test_invalid_user(base_url):
resp = requests.get(f"{base_url}/users/50")
assert resp.status_code == 404
# test_login_user.py
import requests, json
import pytest
def test_login_success(base_url):
payload = {"email": "test@test.com", "password": "something"}
resp = requests.post(f"{base_url}/login/", data=payload)
data = json.loads(resp.text)
assert resp.status_code == 200
assert data["token"] == "QpwL5tke4Pnpja7X"
def test_login_missing_password(base_url):
payload = {"email": "test@test.com"}
resp = requests.post(f"{base_url}/login/", data=payload)
data = json.loads(resp.text)
assert resp.status_code == 400
assert data["error"] == "Missing password"
Fazit
Dieses Tutorial deckte Installation, klare Tests schreiben, Fixtures und Marker nutzen, parallele Ausführung, XML-Reports generieren und ein einfaches API-Test-Suite bauen ab. Mit diesen Fundamenten können Sie Ihre Python-Testing-Praktiken selbstbewusst skalieren.
Python
- WordPress auf Google Cloud installieren: Schritt-für-Schritt Anleitung
- Coded UI Test Automation Framework: Umfassender Einsteigerleitfaden
- Netzwerksicherheitsschlüssel finden & schützen: Einfache Schritte für Ihr WLAN
- WiFi Calling erklärt: Funktionsweise, Vorteile & Bedeutung
- 6G erforscht: Die Zukunft ultraschneller Konnektivität
- Expertenleitfaden: Installation von Andocknivellierern für maximale Effizienz
- Teilentladungsprüfung verstehen: Schutz von Hochspannungsausrüstung
- Pumpenkavitation verhindern: Ursachen, Symptome und Vermeidung
- Kupferhartlöten erklärt: Techniken & Tipps für starke, zuverlässige Verbindungen
- Wartungsrückstand erklärt: Strategien zur Lösung