2 điểm bởi tmdgusya 2026-01-03 | Chưa có bình luận nào. | Chia sẻ qua WhatsApp

Khi viết mã kiểm thử bằng Pytest và sử dụng MagicMock, hẳn ai cũng từng ít nhất một lần gặp cảnh IDE không tự động hoàn thành, hoặc gõ sai tên phương thức do lỗi chính tả và phải mất công dò lỗi.

mock truyền thống rất mạnh mẽ, nhưng thông tin gợi ý kiểu bị mất đi, khiến bạn khó tận dụng sự hỗ trợ từ các trình kiểm tra kiểu như mypy hay pyright. Để giải quyết điều này, tôi đã tạo ra typed-pytest với khả năng hỗ trợ mock an toàn kiểu (type-safe mocking).

Các tính năng chính:

  • Tự động hoàn thành IDE đầy đủ: hỗ trợ tự động hoàn thành không chỉ tên phương thức và tham số của lớp thật, mà còn cả các phương thức dành riêng cho mock như assert_called_once_with.
  • Phát hiện lỗi chính tả ở thời điểm lint: nếu gọi một phương thức không tồn tại hoặc truyền sai đối số, lỗi sẽ được bắt ngay trước khi chạy test (bởi mypy/pyright).
  • Trình tạo stub chuyên dụng: phân tích các lớp trong dự án để tự động tạo file gợi ý kiểu (.pyi). (cũng hỗ trợ các lớp có phụ thuộc bên ngoài như FastAPI, SQLAlchemy, v.v.)
  • Backend linh hoạt: nếu muốn tốc độ nhanh thì dùng inspect, còn nếu cần gợi ý kiểu trả về chính xác hơn thì có thể chọn backend stubgen. (hiện tại stubgen vẫn đang trong giai đoạn thử nghiệm)

Ví dụ sử dụng:

# MagicMock thông thường: có lỗi gõ sai vẫn không thể biết trước khi chạy  
mock = MagicMock(spec=UserService)  
mock.get_usr(1) # lỗi gõ sai của get_user nhưng linter không phát hiện được  
  
# typed-pytest: linter báo lỗi ngay lập tức & hỗ trợ tự động hoàn thành  
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) # ✅ kiểm tra kiểu hoàn tất  

Các file stub được tạo ra được thiết kế để không cần đưa lên Git, mà chỉ cần tạo và sử dụng trong môi trường phát triển cục bộ và CI. Khả năng tương thích với các công cụ hiện đại như uv cũng đã được cân nhắc.

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

Hy vọng công cụ này sẽ hữu ích cho những ai muốn tận dụng trọn vẹn lợi ích của hệ thống kiểu ngay cả trong mã kiểm thử. Mọi phản hồi để cải thiện tính tiện dụng đều luôn được hoan nghênh!!

Chưa có bình luận nào.

Chưa có bình luận nào.