typed-pytest: MagicMock에서 잃어버린 IDE 자동완성과 타입 안전성 되찾기

1 month ago 13

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

테스트 코드에서도 타입 시스템의 이점을 온전히 누리고 싶은 분들께 도움이 되었으면 좋겠습니다. 사용성 개선 피드백은 언제나 환영합니다!!

Read Entire Article