Bắt email trong kiểm thử tự động là cách để bộ kiểm thử tự đọc được thư mà sản phẩm vừa gửi, mà không phải nhờ tới một dịch vụ thư bên ngoài. Cách này biến một việc vốn phụ thuộc vào mạng và vào thời gian chờ thành một việc cục bộ, nhanh và lặp lại được. Bài này giải thích lợi ích, cách làm ở mức ý tưởng, và những chỗ hỏng thường gặp khi đưa vào môi trường chạy tự động.
Vì sao không nên gọi dịch vụ thư bên ngoài trong kiểm thử?
Có ba lý do, và cả ba đều là lý do vận hành chứ không phải lý do kỹ thuật thuần túy. Thứ nhất là độ ổn định: dịch vụ bên ngoài có thể chậm, có thể bảo trì, có thể đổi cách xác thực, và mỗi lần như vậy bộ kiểm thử của bạn đỏ dù sản phẩm không có lỗi. Một bộ kiểm thử hay đỏ vì lý do bên ngoài sẽ nhanh chóng bị cả nhóm bỏ qua.
Thứ hai là tốc độ. Mỗi vòng đợi thư từ một dịch vụ bên ngoài tốn vài giây, và nhân với hàng trăm ca kiểm thử thì đó là vài phút cộng thêm vào mỗi lần chạy. Trên một dự án chạy kiểm thử vài chục lần mỗi ngày, con số đó trở thành thời gian chờ đáng kể.
Thứ ba là dữ liệu. Gửi thư ra ngoài nghĩa là nội dung thư rời khỏi hệ thống của bạn. Trong môi trường chạy tự động, nội dung đó thường là dữ liệu mẫu, nhưng cũng có lúc là bản sao gần giống dữ liệu thật. Giữ thư ở trong máy là cách đơn giản nhất để không phải lo về việc đó.
Cách thu thư ngay trong môi trường chạy kiểm thử
Ý tưởng rất gọn: thay vì cấu hình sản phẩm trỏ tới một dịch vụ thư thật, bạn cấu hình nó trỏ tới một tiến trình nhỏ chạy ngay trong môi trường kiểm thử, lắng nghe trên một cổng cục bộ. Tiến trình đó nhận thư, rồi lưu lại ở đâu đó mà ca kiểm thử đọc được: một tệp trên đĩa, một vùng nhớ dùng chung, hoặc một hộp thư giả có giao diện truy vấn.
Phía ca kiểm thử, bạn không cần biết gì về giao thức thư. Bạn chỉ cần một hàm đọc ra danh sách thư đã nhận, lọc theo địa chỉ người nhận, và lấy nội dung. Vì tất cả đều nằm trong cùng một máy, việc đọc diễn ra gần như tức thì, không có mạng nào ở giữa.
Điểm quan trọng là cấu hình phải thay được theo môi trường. Sản phẩm chỉ nên biết một địa chỉ máy chủ gửi thư, và giá trị đó do môi trường cung cấp: khi chạy thật thì trỏ tới dịch vụ thật, khi chạy kiểm thử thì trỏ tới tiến trình cục bộ. Nếu địa chỉ đó bị viết cứng trong mã, bạn sẽ không thể dùng cách này.
Vì sao cách này ổn định hơn hộp thư thật?
Vì nó bỏ được gần như toàn bộ những thứ không xác định. Không có mạng công khai, nên không có chuyện thư bị chặn ở bên nhận. Không có hàng đợi của bên thứ ba, nên không có chuyện thư tới muộn vài phút. Không có bộ lọc thư rác của nhà cung cấp, nên thư kiểm thử không bị đánh dấu rồi trôi vào một thư mục khác.
Nó cũng nhanh hơn nhiều. Bạn có thể đọc thư ngay sau khi sản phẩm báo đã gửi, thay vì đợi một khoảng thời gian rồi mới thử. Và vì không phụ thuộc vào dịch vụ bên ngoài, bộ kiểm thử chạy được cả khi môi trường không có kết nối ra ngoài — điều mà nhiều hệ thống chạy tự động có.
Cuối cùng, nó cho bạn toàn quyền với nội dung. Bạn có thể lưu cả thư gốc, kể cả phần tiêu đề và phần dữ liệu thô, để khi một ca kiểm thử hỏng bạn có bằng chứng cụ thể mà đọc. Với một hộp thư công khai, bạn thường chỉ có phần nội dung đã được hiển thị.
Những chỗ dễ hỏng cần đề phòng
Chỗ hỏng đầu tiên là chạy song song. Khi nhiều ca kiểm thử chạy cùng lúc và cùng dùng một tiến trình nhận thư, thư của ca này sẽ lẫn vào ca kia. Cách chữa không phải là tắt chạy song song, mà là cấp cho mỗi ca một địa chỉ riêng và luôn lọc theo địa chỉ đó khi đọc.
Chỗ hỏng thứ hai là chờ đợi mù quáng. Ngay cả khi thư ở cùng một máy, việc gửi vẫn diễn ra bất đồng bộ: sản phẩm trả về trước khi thư được ghi xong. Nếu ca kiểm thử đọc ngay lập tức, nó có thể không thấy gì. Cách đúng là đọc lại theo chu kỳ cho tới khi thư xuất hiện, kèm một giới hạn để ca kiểm thử thất bại thay vì treo.
Chỗ hỏng thứ ba là trạng thái còn sót giữa các lần chạy. Nếu hộp thư giả không được dọn, ca kiểm thử lần sau có thể đọc phải thư của lần trước và kết luận sai. Hãy dọn sạch trước mỗi ca, hoặc gắn cho mỗi ca một địa chỉ chắc chắn chưa từng dùng.
Chỗ hỏng thứ tư là cấu hình lệch giữa các môi trường. Một biến môi trường bị thiếu sẽ khiến sản phẩm gửi ra ngoài thật trong khi bạn tưởng nó đang gửi vào máy cục bộ. Hãy để môi trường kiểm thử thất bại ngay khi khởi động nếu thiếu cấu hình đó, đừng để nó âm thầm dùng giá trị mặc định.
Khi nào vẫn cần một hộp thư thật?
Cách thu thư cục bộ không thay thế được mọi thứ. Nếu bạn cần kiểm tra xem thư của mình có đi qua được bộ lọc thư rác của các nhà cung cấp hộp thư phổ biến hay không, bạn buộc phải gửi thật tới một hộp thư thật. Đó là loại kiểm tra không thể mô phỏng ở máy cục bộ.
Bạn cũng cần gửi thật khi kiểm tra các phần liên quan tới xác thực người gửi ở cấp tên miền, tới định dạng hiển thị trong các ứng dụng thư khác nhau, hoặc tới cách thư hiển thị trên điện thoại. Những thứ này phụ thuộc vào bên nhận, nên không thể thay bằng một tiến trình cục bộ.
Và bạn cần gửi thật trong một buổi kiểm tra tổng thể trước khi phát hành, để chắc chắn rằng cấu hình của môi trường thật đúng. Hãy coi đó là một bước riêng, chạy ít lần, không đưa vào vòng chạy tự động thường xuyên. Nếu bạn cần một hộp thư tạm để làm bước đó, công cụ email tạm thời của trang này cấp một địa chỉ trong vài giây. Địa chỉ tạm đó chỉ phục vụ mục đích kiểm thử, không thay cho danh tính thật của bạn và không dùng để mạo danh bất kỳ ai.
Phần dành cho nhà phát triển
Khi đã có một tiến trình thu thư cục bộ, chất lượng của bộ kiểm thử phụ thuộc vào vài quyết định nhỏ. Vài điểm nên chốt:
- Mỗi ca kiểm thử một địa chỉ riêng, và luôn lọc theo địa chỉ khi đọc. Đây là điều kiện để chạy song song an toàn.
- Đọc theo chu kỳ có giới hạn thay vì chờ một khoảng cố định. Cách này vừa nhanh hơn khi mọi thứ suôn sẻ, vừa cho lỗi rõ ràng khi có gì đó sai.
- Khẳng định trên nội dung thư, không chỉ trên sự tồn tại của thư. Một lá thư gửi đúng người nhưng sai biến mẫu cũng là một lỗi cần phát hiện.
- Khi ca kiểm thử thất bại, hãy giữ lại thư gốc kèm nhật ký. Một bản thư thô thường trả lời nhanh hơn nhiều so với việc đọc lại mã.
- Dọn trạng thái trước và sau mỗi ca, đừng dựa vào việc ca trước đã dọn sạch.
- Bắt buộc cấu hình môi trường phải rõ ràng. Một giá trị mặc định âm thầm có thể khiến kiểm thử gửi thư ra ngoài thật.
- Với ca kiểm thử cần đọc mã xác minh trong thư, hãy tách phần đọc mã thành một bước riêng và kiểm thử nó độc lập. Bạn sẽ gặp lại chủ đề đó trong bài mã xác minh trong kiểm thử đầu-cuối.
Một điều cuối: đừng để môi trường kiểm thử âm thầm dùng một tên miền thật. Hãy dùng một tên miền dành riêng cho kiểm thử, và ghi quy ước đó ở nơi cả nhóm đọc được.
Bước tiếp theo
Hãy thử một vòng nhỏ trước: cấu hình môi trường kiểm thử trỏ tới một tiến trình thu thư cục bộ, chạy một ca đăng ký duy nhất, và xem ca đó có đọc được thư hay không. Khi vòng nhỏ đã chạy, bạn có thể mở rộng dần; và nếu bạn muốn hiểu trước những trường hợp cần phủ trong luồng xác minh, bài kiểm thử luồng xác minh email là điểm bắt đầu phù hợp.