Pytest से टेस्ट कोड लिखते समय MagicMock का उपयोग करते हुए, IDE ऑटो-कम्प्लीशन काम न करना या मेथड नाम गलत लिख देने (टाइपो) की वजह से परेशान होने का अनुभव शायद हम में से ज़्यादातर लोगों को एक-दो बार हुआ होगा.

मौजूदा mock बहुत शक्तिशाली हैं, लेकिन टाइप हिंट्स खो जाने की वजह से mypy या pyright जैसे टाइप चेकर की मदद लेना मुश्किल था. इस समस्या को हल करने के लिए मैंने टाइप-सेफ़ mocking (Type-safe mocking) को सपोर्ट करने वाला typed-pytest बनाया है.

मुख्य विशेषताएँ:

  • पूरी IDE ऑटो-कम्प्लीशन: वास्तविक क्लास के मेथड नाम, पैरामीटर ही नहीं बल्कि assert_called_once_with जैसे mock-विशेष मेथड्स तक के लिए ऑटो-कम्प्लीशन सपोर्ट करता है.
  • lint time पर टाइपो पहचान: अगर आप किसी मौजूद न रहने वाले मेथड को कॉल करें या गलत arguments दें, तो टेस्ट चलाने से पहले ही (mypy/pyright) इसे तुरंत पकड़ लिया जाता है.
  • समर्पित stub generator: प्रोजेक्ट की क्लासों का विश्लेषण करके टाइप हिंट फाइलें (.pyi) अपने-आप बनाता है. (FastAPI, SQLAlchemy जैसी बाहरी dependencies वाली क्लासें भी सपोर्टेड हैं)
  • लचीला backend: तेज़ स्पीड चाहिए तो inspect, और ज़्यादा सटीक return type hints चाहिए तो stubgen backend चुन सकते हैं. (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) # ✅ 타입 체크 완료  

बनाई गई stub फाइलों को Git में अपलोड करने की ज़रूरत नहीं है; इन्हें सिर्फ local development environment और CI में generate करके इस्तेमाल करने के लिए डिज़ाइन किया गया है. uv जैसे आधुनिक टूल्स के साथ compatibility का भी ध्यान रखा गया है.

GitHub: https://github.com/tmdgusya/typed-pytest

उम्मीद है कि जो लोग टेस्ट कोड में भी टाइप सिस्टम के फायदे पूरी तरह लेना चाहते हैं, उनके लिए यह उपयोगी होगा. usability सुधारने के लिए feedback हमेशा स्वागत योग्य है!!

अभी कोई टिप्पणी नहीं है.

अभी कोई टिप्पणी नहीं है.