pytest Cheatsheet
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
```bash
# 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 Markern
```bash
# 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 Testabdeckungsberichten
```bash
# 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 Praktiken
`test_`test_`test_user_registration_with_valid_email`test_should_validate_user_login`@pytest.mark.slow`slow`@pytest.mark.integration`integration`@pytest.mark.parametrize`@pytest.mark.parametrize`conftest.py`conftest.py`pytest -x`-x`test_*.py`test_*.py`*_test.py`*_test.py`test_`test_`Test`Test`__init__.py`__init__.py`pip install -e .`pip install -e .`conftest.py`conftest.py`requirements.txt`requirements.txt`pytest --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`.coveragerc`Konfiguration |
| **Marker nicht erkannt** | Registriere Marker in`pytest.ini`oder`pyproject.toml`unter`[tool.pytest.ini_options]`, verwende`--strict-markers`um Tippfehler zu fangen |
| **PDB funktioniert nicht mit Capture** | Verwende`pytest -s --pdb`um Ausgabe-Capturing zu deaktivieren, oder verwende`pytest.set_trace()`anstelle von`pdb.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 in`pytest.ini`:`filterwarnings = ignore::DeprecationWarning`, oder verwende`-W`Flag:`pytest -W ignore::UserWarning` |