pip install pytest``pip install pytest
sudo apt install python3-pytest``sudo apt-get install python3-pytest
sudo dnf install python3-pytest``sudo dnf install python3-pytest
sudo pacman -S python-pytest``sudo pacman -S python-pytest
brew install pytest``brew install pytest
choco install pytest``choco install pytest
python -m venv venv && source venv/bin/activate && pip install pytest``python -m venv venv && source venv/bin/activate && pip install pytest
pip install pytest pytest-cov pytest-xdist pytest-mock pytest-html``pip install pytest pytest-cov pytest-sugar
pytest --version``pytest --version
pytest``pytest
pytest test_file.py``pytest test_file.py
pytest tests/``pytest test_directory/
pytest test_file.py::test_function``pytest test_file.py::test_function_name
pytest test_file.py::TestClass``pytest test_file.py::TestClassName
pytest test_file.py::TestClass::test_method``pytest test_file.py::TestClassName::test_method_name
pytest -v``pytest -v
pytest -vv``pytest -vv
pytest -q``pytest -q
pytest Cheatsheet¶
Installation¶
| Platform | Befehl |
|---|---|
| pip (Alle Plattformen) | |
| Ubuntu/Debian | |
| Fedora/RHEL | |
| Arch Linux | |
| macOS (Homebrew) | |
| Windows (Chocolatey) | |
| Virtueller Umgebung | |
| Mit häufigen Plugins | |
| Installation überprüfen |
Grundlegende Befehle¶
| Befehl | Beschreibung |
|---|---|
| Alle Tests im aktuellen Verzeichnis und Unterverzeichnissen ausführen | |
| Tests in einer bestimmten Datei ausführen | |
| Alle Tests in einem bestimmten Verzeichnis ausführen | |
| Eine bestimmte Testfunktion ausführen | |
| Alle Tests in einer bestimmten Klasse ausführen | |
| Eine bestimmte Testmethode in einer Klasse ausführen | |
| Tests mit ausführlicher Ausgabe (Testnamen anzeigen) | |
| Tests mit sehr ausführlicher Ausgabe (vollständige Details anzeigen) | |
| Tests im stillen Modus ausführen (minimale Ausgabe) | |
pytest -x |
Nach dem ersten Testfehler stoppen |
pytest --maxfail=3 |
Nach N Testfehlern stoppen |
pytest -k "test_user" |
Tests mit Schlüsselwortausdruck ausführen |
pytest -k "user and not admin" |
Tests mit mehreren Schlüsselwörtern ausführen (UND/NICHT-Logik) |
pytest -m "slow" |
Tests mit spezifischem Marker ausführen |
pytest -m "not slow" |
Tests mit spezifischem Marker ausschließen |
pytest --collect-only |
Anzeigen, welche Tests ausgeführt würden, ohne sie auszuführen |
pytest --lf |
Nur Tests ausführen, die im letzten Durchlauf fehlgeschlagen sind (zuletzt fehlgeschlagen) |
pytest --ff |
Fehlgeschlagene Tests zuerst ausführen, dann andere (Fehler zuerst) |
pytest -l |
Lokale Variablen in Rückverfolgungen bei Fehlern anzeigen |
Erweiterte Verwendung¶
| Befehl | Beschreibung |
|---|---|
pytest -n auto |
Tests parallel mit allen verfügbaren CPU-Kernen ausführen (erfordert pytest-xdist) |
pytest -n 4 |
Tests parallel mit 4 Arbeitsprozessen ausführen |
pytest --durations=10 |
Die 10 langsamsten Testdauern anzeigen |
pytest --durations=10 --durations-min=1.0 |
Langsamste Tests anzeigen, die mindestens 1 Sekunde dauern |
pytest --cov=myproject |
Tests mit Code-Coveragebericht ausführen (erfordert pytest-cov) |
pytest --cov=myproject --cov-report=html |
HTML-Coveragebericht im htmlcov/-Verzeichnis generieren |
pytest --cov=myproject --cov-report=term-missing |
Coverage mit fehlenden Zeilennummern im Terminal anzeigen |
pytest --cov=myproject --cov-fail-under=80 |
Bei Coveragewerten unter 80% fehlschlagen |
pytest --cov-branch |
Branch-Coverageanalyse einbeziehen |
pytest --junitxml=report.xml |
JUnit XML-Bericht für CI/CD-Integration generieren |
pytest --html=report.html |
HTML-Testbericht generieren (erfordert pytest-html) |
pytest --pdb |
Bei Testfehlern in Python-Debugger (PDB) wechseln |
pytest --trace |
Zu Beginn jedes Tests in PDB wechseln |
pytest --setup-show |
Setup und Teardown von Fixtures während der Ausführung anzeigen |
pytest --fixtures |
Alle verfügbaren Fixtures und ihre Docstrings auflisten |
pytest --markers |
Alle registrierten Marker auflisten |
pytest --tb=short |
Kürzeres Traceback-Format verwenden |
pytest --tb=line |
Ein Zeile pro Fehler im Traceback anzeigen |
pytest --tb=no |
Traceback-Ausgabe deaktivieren |
pytest -W error::DeprecationWarning |
Veraltungshinweise als Fehler behandeln |
pytest --capture=no |
Ausgabeerfassung deaktivieren (identisch mit -s) |
pytest --timeout=300 |
Timeout von 300 Sekunden pro Test setzen (erfordert pytest-timeout) |
pytest --count=3 |
Jeden Test 3-mal wiederholen (erfordert pytest-repeat) |
pytest --random-order |
Tests in zufälliger Reihenfolge ausführen (erfordert pytest-random-order) |
pytest -ra |
Kurze Testergebniszusammenfassung für alle Tests anzeigen (bestanden, fehlgeschlagen, übersprungen usw.) |
Konfiguration¶
pytest.ini Konfigurationsdatei¶
Im Projektstammverzeichnis platzieren:
[pytest]
# Minimum pytest version required
minversion = 7.0
# Directories to search for tests
testpaths = tests
# Test file patterns
python_files = test_*.py *_test.py
# Test class patterns
python_classes = Test* *Tests
# Test function patterns
python_functions = test_*
# Default command line options
addopts =
-ra
--strict-markers
--strict-config
--verbose
--cov=myproject
--cov-report=html
--cov-report=term-missing
# Custom markers
markers =
slow: marks tests as slow (deselect with '-m "not slow"')
integration: marks tests as integration tests
unit: marks tests as unit tests
smoke: marks tests as smoke tests
database: marks tests requiring database connection
api: marks tests for API testing
# Directories to ignore
norecursedirs = .git .tox dist build *.egg venv node_modules
# Warning filters
filterwarnings =
error
ignore::UserWarning
ignore::DeprecationWarning
# Logging configuration
log_cli = true
log_cli_level = INFO
log_cli_format = %(asctime)s [%(levelname)s] %(message)s
log_cli_date_format = %Y-%m-%d %H:%M:%S
pyproject.toml Konfiguration¶
Moderne Python-Projekte mit pyproject.toml:
[tool.pytest.ini_options]
minversion = "7.0"
testpaths = ["tests"]
python_files = ["test_*.py", "*_test.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
addopts = [
"-ra",
"--strict-markers",
"--cov=myproject",
"--cov-branch",
"--cov-report=html",
"--cov-report=term-missing:skip-covered",
"--cov-fail-under=80",
]
markers = [
"slow: marks tests as slow",
"integration: integration tests",
"unit: unit tests",
"smoke: smoke tests",
]
filterwarnings = [
"error",
"ignore::UserWarning",
]
conftest.py - Gemeinsame Fixtures¶
Im Stammverzeichnis des Testverzeichnisses für gemeinsame Fixtures platzieren:
import pytest
# Session-scoped fixture (runs once per test session)
@pytest.fixture(scope="session")
def database():
"""Provide database connection for entire test session"""
db = create_database_connection()
yield db
db.close()
# Module-scoped fixture (runs once per test module)
@pytest.fixture(scope="module")
def api_client():
"""Provide API client for test module"""
client = APIClient()
yield client
client.cleanup()
# Function-scoped fixture (default, runs for each test)
@pytest.fixture
def sample_data():
"""Provide sample data for testing"""
return {"id": 1, "name": "Test User"}
# Autouse fixture (automatically used by all tests)
@pytest.fixture(autouse=True)
def reset_state():
"""Reset application state before each test"""
clear_cache()
yield
cleanup_resources()
# Parametrized fixture
@pytest.fixture(params=["sqlite", "postgres", "mysql"])
def db_type(request):
"""Test with multiple database types"""
return request.param
# Configure pytest hooks
def pytest_configure(config):
"""Add custom configuration"""
config.addinivalue_line(
"markers", "custom: custom marker description"
)
Häufige Anwendungsfälle¶
Anwendungsfall 1: Grundlegende Unittests¶
# Create test file
cat > test_calculator.py << 'EOF'
def add(a, b):
return a + b
def test_add():
assert add(2, 3) == 5
assert add(-1, 1) == 0
assert add(0, 0) == 0
EOF
# Run the tests
pytest test_calculator.py -v
Anwendungsfall 2: Testen mit Fixtures```bash¶
Create test with fixtures¶
cat > test_user.py << 'EOF' import pytest
@pytest.fixture def user_data(): return {"username": "testuser", "email": "test@example.com"}
def test_user_creation(user_data): assert user_data["username"] == "testuser" assert "@" in user_data["email"] EOF
Run tests with fixture details¶
pytest test_user.py -v --setup-show
### Anwendungsfall 3: Parametrisiertes Testenbash
Create parametrized tests¶
cat > test_math.py << 'EOF' import pytest
@pytest.mark.parametrize("input,expected", [ (2, 4), (3, 9), (4, 16), (5, 25), ]) def test_square(input, expected): assert input ** 2 == expected EOF
Run parametrized tests¶
pytest test_math.py -v
### Anwendungsfall 4: Integrationstests mit Markernbash
Create tests with markers¶
cat > test_api.py << 'EOF' import pytest
@pytest.mark.unit def test_data_validation(): assert True
@pytest.mark.integration def test_api_endpoint(): # Simulated API test assert True
@pytest.mark.slow @pytest.mark.integration def test_full_workflow(): # Long-running test assert True EOF
Run only unit tests¶
pytest test_api.py -m unit -v
Run integration tests excluding slow ones¶
pytest test_api.py -m "integration and not slow" -v
### Anwendungsfall 5: Generierung von Testabdeckungsberichtenbash
Run tests with coverage and generate reports¶
pytest --cov=myproject --cov-report=html --cov-report=term-missing
View coverage report¶
HTML report will be in htmlcov/index.html¶
Run with coverage threshold¶
pytest --cov=myproject --cov-fail-under=80
Generate coverage badge¶
pytest --cov=myproject --cov-report=term --cov-report=html
``## Bewährte Praktikentest_test_test_user_registration_with_valid_emailtest_should_validate_user_login@pytest.mark.slowslow@pytest.mark.integrationintegration@pytest.mark.parametrize@pytest.mark.parametrizeconftest.pyconftest.pypytest -x-xtest_.pytest_*.pytest.py*_test.pytesttest_TestTestinit.py__init__.pypip install -e .pip install -e .conftest.pyconftest.pyrequirements.txtrequirements.txtpytest --durations=10`--durations=10
The translations preserve the markdown formatting, keep technical terms in English, and maintain the same structure and punctuation as the original text.
Would you like me to elaborate on any part of the translation?pytest -n auto, markiere langsame Tests mit@pytest.mark.slow|
| Coverage funktioniert nicht | Installiere pytest-cov:pip install pytest-cov, stelle sicher, dass der Quellpfad korrekt ist:--cov=myproject, überprüfe.coveragercKonfiguration |
| Marker nicht erkannt | Registriere Marker inpytest.inioderpyproject.tomlunter[tool.pytest.ini_options], verwende--strict-markersum Tippfehler zu fangen |
| PDB funktioniert nicht mit Capture | Verwendepytest -s --pdbum Ausgabe-Capturing zu deaktivieren, oder verwendepytest.set_trace()anstelle vonpdb.set_trace()|
| Fixtures laufen in falscher Reihenfolge | Überprüfe Fixture-Scope (Session > Modul > Klasse > Funktion), verwende@pytest.fixture(autouse=True)vorsichtig, überprüfe Abhängigkeitskette |
| Parallele Tests schlagen fehl | Stelle sicher, dass Tests isoliert sind und keinen Zustand teilen, überprüfe Racebedingungen, verwende korrekte Sperrung für gemeinsam genutzte Ressourcen |
| Speicherlecks in Tests | Verwende@pytest.fixture(scope="function")für ordnungsgemäße Bereinigung, stelle sicher, dass Fixtures korrekt aufräumen, überprüfe Zirkelreferenzen |
| Warnungen verstopfen die Ausgabe | Konfiguriere Warnungsfilter inpytest.ini:filterwarnings = ignore::DeprecationWarning, oder verwende-WFlag:pytest -W ignore::UserWarning |