typed-pytest: MagicMockで失われたIDE自動補完と型安全性を取り戻す
(github.com/tmdgusya)Pytestでテストコードを書く際にMagicMockを使うと、IDEの自動補完が効かなかったり、メソッド名を間違えて入力してしまい(タイプミス)、無駄にハマった経験が一度や二度はあるはずです。
従来のmockは非常に強力ですが、型ヒントが失われるため、mypyやpyrightのような型チェッカーの助けを受けにくいという問題がありました。これを解決するために、型安全なモッキング(Type-safe mocking) をサポートするtyped-pytestを作りました。
主な特徴:
- 完全なIDE自動補完: 実際のクラスのメソッド名、パラメータはもちろん、assert_called_once_withのようなモック専用メソッドまで自動補完をサポートします。
- リント時のタイプミス検出: 存在しないメソッドを呼び出したり、引数を誤って渡したりすると、テスト実行前に(mypy/pyrightで)即座に検出できます。
- 専用スタブ(Stub)生成器: プロジェクト内のクラスを解析し、型ヒントファイル(.pyi)を自動生成します。(FastAPI、SQLAlchemyなど外部依存を持つクラスにも対応)
- 柔軟なバックエンド: 速度を重視するならinspect、より精密な戻り値の型ヒントが必要ならstubgenバックエンドを選べます。(現在stubgenは実験段階です)
使用例:
# 従来の MagicMock: タイプミスがあっても実行前にはわからない
mock = MagicMock(spec=UserService)
mock.get_usr(1) # get_userのタイプミスだが、リンターでは検出できない
# typed-pytest: リンターが即座にエラーを出し、自動補完にも対応
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) # ✅ 型チェック完了
生成されたスタブファイルはGitにコミットする必要がなく、ローカル開発環境とCIでのみ生成して使うように設計されています。uvのような最新ツールとの互換性も考慮されています。
GitHub: https://github.com/tmdgusya/typed-pytest
テストコードでも型システムの利点を存分に活かしたい方の助けになれば嬉しいです。使い勝手の改善に関するフィードバックはいつでも歓迎します!!
まだコメントはありません。