Mocks Là Gì? 'Phù Thủy' Giúp Code Bạn Bớt 'Khó Tính' Khi Test!
Lê Lân
0
Tìm Hiểu Về Mocking Trong Kiểm Thử Phần Mềm: Bí Quyết Giúp Việc Kiểm Thử Hiệu Quả Hơn
Mở Đầu
Trong quá trình phát triển phần mềm, đặc biệt khi xây dựng các ứng dụng phức tạp hơn những ứng dụng đơn giản như to-do app, một điều sẽ nhanh chóng hiện ra: kiểm thử phần mềm thực sự quan trọng. Cảm giác “mọi thứ chạy ngon lành trên máy mình” đôi khi lại không đồng nghĩa với việc ứng dụng chạy mượt mà trong môi trường sản xuất. Tuy nhiên, việc kiểm thử trực tiếp các phụ thuộc thực tế trong mỗi bài test có thể là điều rất khó khăn. Kiểm thử chậm, liên tục phụ thuộc vào các dịch vụ ngoài, dịch vụ API có thể bị giới hạn số lần gọi... tất cả tạo nên một chuỗi các bài kiểm thử không ổn định và gây phiền toái.
Đó chính là lúc mocks – một công cụ hữu ích hỗ trợ tập trung vào logic xử lý chính của phần mềm mà không cần lo lắng về các dịch vụ bên ngoài – trở thành người bạn đồng hành không thể thiếu cho lập trình viên và tester.
💡 What’s Testing Without Mocks Like?
Thách Thức Khi Kiểm Thử Thực Tế
Giả sử bạn có một dịch vụ lấy dữ liệu từ một API bên ngoài hay cơ sở dữ liệu. Một bài kiểm thử được viết ra sẽ:
Gửi một yêu cầu HTTP thật đến dịch vụ ☁️
Kết nối với cơ sở dữ liệu thật 🧱
Phải chờ đợi phản hồi ⏳
Và đôi khi bị lỗi khi API hoặc DB không phản hồi 😮💨
Nếu bạn chạy thử bài kiểm thử này 50 lần và trên nhiều thành phần khác nhau, điều này sẽ dẫn đến:
Kiểm thử chậm
Dễ bị lỗi vặt gây khó chịu
Độ bền thấp, khó tin cậy
🤝 Enter Mocks: Your Test Double
Mocks Là Gì?
Mocks cho phép bạn giả lập những phần của hệ thống không cần thiết phải chạy thật trong môi trường kiểm thử. Có thể là một API bên ngoài, các truy vấn database hoặc một hàm phức tạp bạn không cần kiểm thử trực tiếp.
Ví Dụ Minh Hoạ
Bạn muốn kiểm tra xem ứng dụng có gọi được hàm SendEmail() với tham số đúng hay không mà không thực sự gửi email đi.
Mục tiêu của mocking: Tập trung vào logic bạn cần kiểm tra, tránh chi phí và rủi ro do phụ thuộc bên ngoài.
🔧 So How Do Mocks Actually Work?
Về mặt kỹ thuật, mock thay thế một phụ thuộc thực tế bằng một phiên bản giả được điều khiển để bạn có thể:
Cài đặt trả về các giá trị cụ thể
Theo dõi xem mock có được gọi hay không, gọi bao nhiêu lần
Mô phỏng các trường hợp như lỗi, phản hồi chậm…
Nhiều thư viện còn hỗ trợ tự động sinh code mock dựa trên interface, giảm tải công sức cho dev.
🧰 Mock Libraries You Should Know
📦 Node.js (JavaScript/TypeScript)
Thư Viện
Tính Năng Nổi Bật
Tài Liệu
Jest
Hỗ trợ mocking tích hợp:
jest.fn()
,
jest.mock()
Theo dõi gọi hàm, set giá trị trả về, xây dựng lỗi mô phỏng
Bạn chỉ cần mock những dịch vụ này và kiểm tra xem:
“Họ có được gọi đúng lúc không?”
Lợi Ích Trong Tình Huống Thực Tế:
Giảm thiểu thời gian chạy kiểm thử
Tăng tính ổn định không bị phụ thuộc dịch vụ ngoài
Tập trung vào nghiệp vụ chính
🚀 Benefits of Using Mocks
✅ Kiểm thử nhanh hơn (không gọi mạng hoặc dịch vụ ngoài)
✅ Độ tin cậy cao hơn, giảm lỗi gián đoạn do dịch vụ bên ngoài
✅ Dễ dàng cô lập và tập trung kiểm thử logic cụ thể
✅ Dễ mô phỏng các tình huống lỗi, trường hợp biên
✅ Giúp thiết kế phần mềm tốt hơn, khuyến khích sử dụng interfaces và kiến trúc sạch
Lưu ý: Mocks không thay thế được kiểm thử tích hợp hoặc end-to-end, nhưng là công cụ tuyệt vời giúp tăng hiệu quả kiểm thử đơn vị.
💭 Final Thoughts
Mocking là một kỹ thuật kiểm thử cực kỳ hữu ích và khi bạn đã làm quen, nó trở thành công cụ không thể thiếu trong bộ công cụ phát triển Backend. Mục đích không phải để tránh kiểm thử thật mà là tạo ra môi trường an toàn — nhanh, đáng tin cậy và tập trung vào logic cần kiểm thử.
Nếu bạn nghiêm túc về phát triển phần mềm backend, việc sử dụng mocks là điều bắt buộc.
🧵 TL;DR
Đừng kiểm thử phụ thuộc thực tế trong mọi bài test
Mock các dịch vụ bạn không kiểm soát hoặc không cần kiểm tra sâu
Sử dụng các thư viện phù hợp như Jest, Sinon, Testify/mock hoặc GoMock tùy ngôn ngữ
Viết các bài kiểm thử nhanh, rõ ràng và ít gặp lỗi