typed-pytest: Verlorene IDE-Autovervollständigung und Typsicherheit bei MagicMock zurückholen
(github.com/tmdgusya)Beim Schreiben von Testcode mit Pytest hat wohl fast jeder schon ein- oder zweimal erlebt, dass bei der Verwendung von MagicMock die IDE-Autovervollständigung nicht funktioniert oder man sich mit falsch geschriebenen Methodennamen (Typos) herumärgert.
Bestehende Mocks sind sehr leistungsfähig, aber Typhinweise gehen verloren, sodass sich die Unterstützung durch Type-Checker wie mypy oder pyright nur schwer nutzen lässt. Um dieses Problem zu lösen, habe ich typed-pytest entwickelt, das typsicheres Mocking (Type-safe mocking) unterstützt.
Wichtige Merkmale:
- Vollständige IDE-Autovervollständigung: Unterstützt die Autovervollständigung nicht nur für Methodennamen und Parameter der echten Klasse, sondern auch für mock-spezifische Methoden wie
assert_called_once_with. - Erkennung von Tippfehlern zur Lint-Zeit: Wenn eine nicht existierende Methode aufgerufen oder ein falsches Argument übergeben wird, wird dies sofort vor dem Ausführen der Tests von mypy/pyright erkannt.
- Eigener Stub-Generator: Analysiert die Klassen des Projekts und erzeugt automatisch Typhinweis-Dateien (
.pyi). (Unterstützt auch Klassen mit externen Abhängigkeiten wie FastAPI, SQLAlchemy usw.) - Flexibles Backend: Wenn Geschwindigkeit wichtig ist, kann
inspectverwendet werden; wenn präzisere Return-Type-Hinweise benötigt werden, lässt sich dasstubgen-Backend wählen. (stubgenbefindet sich derzeit im experimentellen Stadium.)
Nutzungsbeispiel:
# Herkömmliches MagicMock: Auch bei Tippfehlern vor der Ausführung nicht erkennbar
mock = MagicMock(spec=UserService)
mock.get_usr(1) # Tippfehler von get_user, wird aber vom Linter nicht erkannt
# typed-pytest: Linter meldet sofort einen Fehler & automatische Vervollständigung wird unterstützt
from typed_pytest_stubs import typed_mock, UserService
mock = typed_mock(UserService)
mock.get_usr # ❌ Error: "get_usr" is not a member of UserService
mock.get_user.assert_called_once_with(user_id=1) # ✅ Typprüfung abgeschlossen
Die erzeugten Stub-Dateien sind so konzipiert, dass sie nicht in Git eingecheckt werden müssen, sondern nur in der lokalen Entwicklungsumgebung und in CI erzeugt und verwendet werden. Auch die Kompatibilität mit modernen Tools wie uv wurde berücksichtigt.
GitHub: https://github.com/tmdgusya/typed-pytest
Ich hoffe, dass dies für alle hilfreich ist, die auch in Testcode die Vorteile des Typsystems voll ausschöpfen möchten. Feedback zur Verbesserung der Benutzbarkeit ist jederzeit willkommen!!
Noch keine Kommentare.