Dùng mock thay cho mã SMS thật trong bài kiểm thử đăng ký chỉ kiểm tra được biểu mẫu chứ không kiểm tra được toàn bộ kịch bản: mock không phát hiện được độ trễ khi gửi, định dạng mã bất ngờ từ một dịch vụ cụ thể, hay việc quy trình bị đứt ở bước nhập email xác nhận. Chạy với mã thật là cách duy nhất để chắc chắn rằng chuỗi đăng ký vẫn hoạt động tốt, từ lần yêu cầu số đầu tiên đến khi đăng nhập vào tài khoản.

Vì sao cần kịch bản với mã thật

Mã giả lập luôn đến ngay lập tức và đúng định dạng mong đợi, còn thực tế thì khác. Nhà mạng có thể chậm gửi 20–40 giây, mã có thể đến bằng hai tin SMS thay vì một, email xác nhận có thể bị xếp vào hàng đợi kiểm duyệt ở phía dịch vụ email. Mock không tái hiện được kịch bản nào trong số này, trong khi chính chúng thường làm hỏng quy trình đăng ký trên môi trường production vốn đã nhiều tháng không ai đụng tới.

Lý do thứ hai là kiểm tra toàn bộ tích hợp. Bài kiểm thử với mã thật không chỉ kiểm tra việc phân tích SMS mà còn kiểm tra cả chuỗi: yêu cầu số qua API, mã được chuyển đến phía bạn, trích xuất mã từ nội dung tin nhắn, nhập vào biểu mẫu, hoàn tất kích hoạt. Đứt ở bất kỳ khâu nào cũng là lỗi nên bắt ngay trong CI chứ không phải trên production.

Quy trình chạy end-to-end hoạt động thế nào

Kịch bản gồm ba bước. Bước một là yêu cầu số điện thoại hoặc địa chỉ email qua API trước khi bắt đầu đăng ký trên nền tảng đích. Bước hai là chờ mã: mã không đến ngay lập tức, vì vậy pipeline truy vấn trạng thái theo khoảng thời gian cố định thay vì chỉ chờ một lần với một timeout duy nhất. Bước ba là hoàn tất: mã được điền vào biểu mẫu, việc đăng ký kết thúc, còn số hoặc địa chỉ được đánh dấu là đã sử dụng để không gửi yêu cầu lặp lại cho một mã sẽ không bao giờ đến nữa.

Timeout chờ mã nên đặt dư ra so với thời gian gửi thông thường: nếu bình thường mã đến sau 10–15 giây thì hợp lý là đặt timeout trong pipeline ở mức 60–90 giây chứ không phải 15. Chỉ nên yêu cầu lại mã một lần, sau khi timeout đầu tiên hết hạn: lần thử thứ hai xử lý được tình huống nhà mạng thỉnh thoảng bị chậm, còn lần thứ ba thường cho thấy chuỗi đang gặp sự cố thật chứ không phải dao động khi gửi.

Vì sao đây là lượt chạy riêng, hiếm, chứ không phải một phần của mỗi commit

Bài kiểm thử với mã thật tốn tiền ở mỗi lần chạy, vì số hoặc địa chỉ bị trừ phí dù kết quả thế nào, và phụ thuộc vào một dịch vụ bên ngoài có độ trễ nằm ngoài tầm kiểm soát của bạn. Chạy nó cho từng commit nghĩa là phải trả tiền cho mỗi lần push lên nhánh và nhận về những bản build đỏ ngẫu nhiên, không phải do lỗi của mã mà do độ trễ gửi từ bên ngoài.

Cách làm hiệu quả là giữ các bài kiểm thử nhanh dùng mock trong pipeline thông thường cho mỗi commit, còn kịch bản với mã thật thì tách thành một lượt chạy riêng, hiếm: trước khi phát hành, mỗi ngày một lần theo lịch, hoặc chạy thủ công trước khi merge vào nhánh chính. Cách này bắt được các lỗi hồi quy thực sự trong chuỗi gửi mã mà không làm tăng chi phí và thời gian của bản build thông thường.

Tách dữ liệu kiểm thử khỏi dữ liệu thật

Số điện thoại và địa chỉ email cho autotest nên lấy từ một nhóm riêng, không dùng chung số dư với các tác vụ thật: trộn lẫn khiến việc theo dõi chi phí khó hơn và có nguy cơ lượt chạy kiểm thử vô tình lấy mất số đã dành cho một quy trình thật. Các tài khoản do bài kiểm thử tạo ra nên được gắn nhãn bằng một tiền tố hoặc tên miền email riêng và dọn dẹp theo lịch, nếu không các bản ghi kiểm thử sẽ tích tụ trong cùng các bảng với người dùng thật và làm sai lệch số liệu phân tích.

Theo dõi chi phí cho các lượt chạy

Mỗi lượt chạy với mã thật là một khoản trừ phí cho số hoặc địa chỉ email, cộng với thời gian thực thi trong pipeline. Nên tính chi phí của một kịch bản đầy đủ rồi nhân với tần suất chạy: mỗi ngày một lần thì ngân sách ở một mức, còn chạy cho mỗi commit trên nhánh đang hoạt động thì ở mức hoàn toàn khác, cao gấp nhiều lần mà lợi ích không tăng tương ứng. Một mốc tham khảo hợp lý là giữ các lượt chạy với mã thật đủ thường xuyên để bắt lỗi hồi quy trước khi phát hành, nhưng đủ thưa để chi phí CI không vượt quá chi phí của chính dịch vụ.

Câu hỏi thường gặp

Có thể bỏ hoàn toàn mock để dùng mã thật không?

Không cần thiết: mock nhanh, miễn phí và phù hợp để kiểm tra logic phân tích cú pháp cũng như biểu mẫu ở mỗi commit. Mã thật chỉ cần cho một kịch bản end-to-end riêng, nhằm bắt các vấn đề về tích hợp và gửi mã, chứ không phải để kiểm thử mã ứng dụng sau mỗi lần chỉnh sửa.

Nên làm gì nếu mã không đến trong thời gian timeout đã định?

Thử yêu cầu lại một lần là bước đầu hợp lý: nó xử lý được tình huống nhà mạng chậm ngẫu nhiên. Nếu sau lần thử lại mã vẫn không đến, bài kiểm thử nên thất bại một cách rõ ràng, dứt khoát chứ không treo cho đến timeout chung của pipeline, điều này giúp tiết kiệm thời gian tìm nguyên nhân và chỉ rõ vấn đề nằm ở chuỗi gửi mã chứ không phải dao động thông thường.

Bao lâu nên chạy kịch bản với mã thật một lần?

Một phương án thực tế là mỗi ngày một lần theo lịch, cộng thêm một lượt chạy bắt buộc trước khi phát hành lên nhánh chính. Nhịp này bắt được lỗi hồi quy trong thời gian hợp lý và giữ chi phí số và địa chỉ ở mức dự đoán được, không gắn với số commit trong quá trình phát triển.

Cách yêu cầu số và truy vấn trạng thái mã ở phía API được mô tả trong tài liệu API. Bạn có thể lấy số cho lượt chạy thử đầu tiên ở mục OTP, còn nguyên tắc truy vấn trạng thái qua API cũng giống như khi xoay IP qua API. Chi phí cho các lượt chạy định kỳ có thể theo dõi thuận tiện trong lịch sử giao dịch.