Kiểm thử xác minh độ tuổi là việc kiểm tra xem hệ thống có chặn và cho qua đúng người ở mỗi ngưỡng tuổi hay không. Phần khó không nằm ở chỗ tính tuổi, mà ở chỗ mỗi ngưỡng đến từ một quy định khác nhau, và ngày biên chỉ xuất hiện đúng một lần mỗi năm. Bài này giúp bạn dựng bộ kiểm thử bao được những trường hợp đó.
Các mốc tuổi 13, 16, 18 và 21 đến từ đâu?
Bốn mốc này không thuộc cùng một hệ thống, và đó là lý do chúng cùng tồn tại. Mốc 13 gắn với quy định của Hoa Kỳ về việc thu thập dữ liệu của trẻ em trực tuyến. Mốc 16 gắn với tuổi đồng ý mặc định trong quy định bảo vệ dữ liệu của Liên minh châu Âu đối với dịch vụ xã hội thông tin, và các nước thành viên có thể điều chỉnh trong khoảng từ 13 tới 16. Mốc 18 là tuổi trưởng thành theo quy định của phần lớn các nước. Mốc 21 xuất hiện ở một số ít nơi, thường gắn với các hoạt động như đồ uống có cồn.
Vì chúng đến từ những nguồn khác nhau, đừng gộp chúng thành một quy tắc chung cho toàn sản phẩm. Một sản phẩm có thể phải áp mốc 13 cho tính năng thu thập dữ liệu, mốc 18 cho một giao dịch tài chính, và mốc 21 cho một mặt hàng khác. Mỗi ngưỡng nên được khai báo riêng, kèm ghi chú về lý do.
Điều này cũng có nghĩa là ngưỡng tuổi là dữ liệu cấu hình, không phải con số nằm rải trong mã. Khi quy định thay đổi hoặc khi bạn mở rộng sang thị trường mới, bạn cần sửa một chỗ.
Tự khai ngày sinh khác gì đối chiếu giấy tờ?
Hai cách này cho mức độ tin cậy rất khác nhau. Cách thứ nhất chỉ hỏi người dùng ngày sinh và tin vào câu trả lời. Nó rẻ, chạy được cho mọi người dùng, và đủ cho phần lớn sản phẩm. Nhưng nó không xác minh gì cả: người dùng có thể nhập một ngày bất kỳ, và hệ thống không có cách nào biết.
Cách thứ hai yêu cầu bằng chứng từ giấy tờ do cơ quan có thẩm quyền cấp, hoặc một dịch vụ xác minh độc lập. Cách này đáng tin hơn nhiều nhưng cũng đắt hơn, chậm hơn, và tạo thêm rủi ro về dữ liệu cá nhân vì bạn phải xử lý ảnh giấy tờ.
Với mục đích kiểm thử, điều cần nhớ là dữ liệu danh tính tổng hợp không thể thay thế cách thứ hai. Nó chỉ để thử biểu mẫu và luồng xử lý, không dùng để mạo danh ai và không thể vượt qua bất kỳ bước xác minh thật nào. Nếu sản phẩm của bạn có luồng đối chiếu giấy tờ, hãy thử nó bằng dữ liệu giả trong môi trường mô phỏng, chứ đừng kỳ vọng một bản ghi sinh tự động đi qua được quy trình thật.
Ngày biên nên được thử thế nào?
Ngày biên là ngày mà câu trả lời của hệ thống phải đổi. Với một ngưỡng tuổi, đó là ngày sinh nhật khi người dùng vừa đủ tuổi. Quy ước phổ biến là tính theo số lần sinh nhật đã đi qua, và vào đúng ngày sinh nhật thì người đó được coi là đã đạt tuổi mới.
Từ đó, bộ kiểm thử tối thiểu cần ba mốc: một người còn thiếu đúng một ngày, một người vừa đủ tuổi hôm nay, và một người đã đủ tuổi từ hôm qua. Ba mốc này bao được lỗi lệch một ngày, vốn là lỗi phổ biến nhất ở loại kiểm tra này.
Cần nhớ thêm rằng kết quả phụ thuộc vào ngày hôm nay theo múi giờ nào. Nếu máy chủ tính tuổi theo múi giờ của nó, còn người dùng ở nơi đã sang ngày mới, hai bên sẽ ra hai kết quả khác nhau trong vài giờ mỗi ngày. Hãy ghi rõ múi giờ được dùng để tính, và nếu có thể, tính theo múi giờ của người dùng.
Người sinh ngày 29 tháng 2 thì tính ra sao?
Đây là trường hợp hiếm nhưng có thật, và không có một cách xử lý được mọi nơi chấp nhận. Một số hệ thống coi ngày đạt tuổi là ngày 28 tháng 2 của năm không nhuận, số khác dùng ngày 1 tháng 3. Cả hai cách đều tồn tại trong thực tế.
Vì vậy, điều quan trọng không phải là chọn cách nào cho đúng, mà là chọn một cách, viết nó ra thành quy tắc rõ ràng, và kiểm thử đúng theo quy tắc đó. Nếu sản phẩm của bạn dùng một thư viện ngày tháng, hãy xem thư viện đó xử lý ra sao thay vì mặc định rằng nó làm đúng như bạn nghĩ.
Bạn cũng nên có ít nhất một fixture cho trường hợp này. Khi hệ thống đổi thư viện hoặc đổi cách tính, bài kiểm thử đó sẽ là thứ đầu tiên phát hiện thay đổi hành vi. Bài kiểm tra ngày sinh và các trường hợp biên đi sâu hơn vào các vấn đề ngày tháng liên quan.
Làm sao có dữ liệu để thử nhiều mốc tuổi?
Bạn cần những bản ghi có ngày sinh rơi đúng vào các mốc cần thử, và cần đủ nhiều để phủ các ngưỡng khác nhau. Trình tạo dữ liệu danh tính và kiểm thử trực tuyến của trang này sinh bản ghi đầy đủ theo quốc gia, kèm ngày sinh và độ tuổi tương ứng, để bạn có sẵn dữ liệu nền rồi chỉnh lại ngày sinh về đúng mốc biên.
Dữ liệu tạo ra là dữ liệu tổng hợp, chỉ dùng cho kiểm thử phần mềm và trình diễn, không ứng với người có thật, không dùng để mạo danh ai. Vì vậy nó phù hợp để thử biểu mẫu, thông báo lỗi và luồng chặn, nhưng không phải để chứng minh rằng hệ thống xác minh được tuổi thật của một người.
Cách làm hiệu quả là dựng một bộ mẫu nhỏ nhưng có chủ đích: một bản cho mỗi ngưỡng bạn đang áp, và với mỗi ngưỡng là ba bản ở ba mốc biên. Với một sản phẩm quốc tế, hãy kiểm tra thêm rằng ngưỡng được chọn theo quốc gia của người dùng chứ không phải theo một giá trị mặc định.
Phần dành cho nhà phát triển
Hãy để ngưỡng tuổi nằm trong cấu hình, kèm theo phạm vi áp dụng và lý do. Khi ngưỡng nằm rải trong mã, việc trả lời câu hỏi vì sao một người dùng bị chặn sẽ mất rất nhiều thời gian, và mỗi lần quy định đổi bạn phải sửa nhiều nơi.
Vài điểm nên chốt:
- Tính tuổi bằng cách so ngày, không lấy năm hiện tại trừ năm sinh. Cách sau sai với những người chưa tới sinh nhật trong năm.
- Không lưu tuổi như một trường cố định trong hồ sơ. Tuổi thay đổi mỗi năm, còn ngày sinh thì không.
- Tách rõ hai mức: kiểm tra độ tuổi tự khai và kiểm tra bằng giấy tờ. Trộn chúng vào một hàm sẽ khiến thông báo lỗi không còn phân biệt được hai tình huống rất khác nhau.
- Chuẩn bị fixture cho ngày biên, cho người sinh ngày 29 tháng 2, và cho trường hợp ngày sinh nằm ở tương lai do nhập sai.
- Kiểm tra rằng ngưỡng áp cho từng tính năng, chứ không phải một ngưỡng duy nhất cho cả sản phẩm.
Cuối cùng, hãy viết thông báo chặn sao cho trung thực. Nói rằng hệ thống chưa thể phục vụ người dùng ở độ tuổi này thì đúng, còn ngụ ý rằng hệ thống đã xác minh được tuổi thật của họ thì không.
Bước tiếp theo
Hãy liệt kê mọi ngưỡng tuổi đang tồn tại trong sản phẩm của bạn và nguồn gốc của từng ngưỡng, rồi dựng ba mốc biên cho mỗi ngưỡng đó. Sau đó mở trình tạo dữ liệu danh tính để sinh phần dữ liệu nền, chỉnh ngày sinh về đúng mốc cần thử, và lưu chúng lại thành bộ mẫu cố định cho những lần chạy sau.