Địa chỉ và số điện thoại là hai loại trường dễ bị đối xử như một chuỗi ký tự tự do nhất. Với dự án chỉ phục vụ một quốc gia, cách nghĩ đó ít gây hậu quả. Nhưng khi phải hỗ trợ nhiều ngôn ngữ và nhiều khu vực, khác biệt về định dạng biến thành lỗi kiểm tra hợp lệ, thất bại khi lưu trữ và những điểm ghim sai trên bản đồ.
Bài này sắp xếp các khác biệt đó thành từng nhóm để bạn rà lại biểu mẫu, quy tắc kiểm tra và độ rộng cột trong cơ sở dữ liệu. Cách trình bày đi từ câu hỏi dễ bỏ sót nhất tới những chi tiết chỉ lộ ra khi đã chạy thật. Dữ liệu mà công cụ của trang này tạo ra là dữ liệu tổng hợp: định dạng mô phỏng giấy tờ thật, và với những quốc gia đã triển khai thuật toán kiểm tra, số kiểm tra đều vượt qua phép kiểm tra đó. Dữ liệu không tương ứng với bất kỳ người, địa chỉ hay tài khoản thật nào và không do cơ quan nào cấp. Mục đích là kiểm thử phần mềm, không phải giả mạo danh tính hay lách bước xác minh danh tính.
Vì sao định dạng địa chỉ và số điện thoại khác nhau giữa các quốc gia?
Khác biệt không nằm ở chỗ người ta viết hay hay viết dở, mà ở chỗ hệ thống bưu chính và hệ thống viễn thông của mỗi nước được tổ chức theo một cách riêng. Địa chỉ được viết theo thói quen đọc của nhân viên phân loại thư, còn số điện thoại được viết theo cách hệ thống chuyển mạch định tuyến cuộc gọi.
Vì vậy, mọi quy tắc chung đều chỉ đúng cho tới khi gặp quốc gia đầu tiên không tuân theo nó. Một quy tắc kiểu sáu chữ số cho mã bưu chính, hay một độ dài cố định cho số điện thoại, sẽ thất bại ngay ở mẫu đầu tiên không phải của quốc gia mà bạn quen thuộc nhất.
Điểm cần nhớ khi thiết kế là tách hai việc ra: hiển thị theo thói quen của từng nước, và kiểm tra theo quy tắc của từng nước. Gộp hai việc đó vào một chỗ là sai lầm tốn kém nhất trong phần này.
Thứ tự dòng địa chỉ và cách viết liền
Địa chỉ viết từ lớn đến nhỏ hay từ nhỏ đến lớn là khác nhau giữa các nước. Trung Quốc, Nhật Bản, Hàn Quốc và Đài Loan theo thói quen viết từ lớn đến nhỏ: quốc gia, tỉnh hoặc phủ, thành phố, quận, đường, số nhà. Hoa Kỳ, Anh, Đức, Pháp và Úc viết ngược lại: số nhà, đường, thành phố, bang hoặc tỉnh, mã bưu chính, quốc gia.
Điểm đáng lưu ý với người làm sản phẩm quốc tế không nằm ở phần hiển thị mà ở phần phân tích. Nếu biểu mẫu chỉ có một ô văn bản tự do rồi mặc định rằng dòng đầu tiên là thành phố, dữ liệu do người dùng châu Âu và châu Mỹ nhập chắc chắn sẽ bị lệch. Khi kiểm thử, tối thiểu phải chuẩn bị mẫu theo cả hai thứ tự và xác nhận hệ thống không nhầm số nhà thành tên thành phố.
Một điểm nữa thường bị bỏ qua là tên quốc gia. Cùng một quốc gia có thể được viết khác nhau ở mỗi ngôn ngữ, và cùng một cái tên có thể ứng với nhiều quốc gia. Việc địa chỉ lưu tên quốc gia dưới dạng văn bản tự do hay mã quốc gia có kiểm soát sẽ quyết định bạn phải kiểm thử những gì.
Địa chỉ của Trung Quốc, Nhật Bản và Hàn Quốc thường được viết liền, không có dấu cách giữa các cấp: tỉnh, thành phố, quận, đường, số nhà nối tiếp nhau, và số nhà kết thúc bằng một ký tự đánh dấu. Địa chỉ theo chữ Latinh thì phân tách bằng dấu cách và dấu phẩy. Nếu biểu mẫu có logic cắt địa chỉ theo dấu cách, địa chỉ viết liền sẽ trở thành một từ duy nhất và kết quả cắt hoàn toàn sai.
Vị trí và số chữ số của mã bưu chính
Vị trí của mã bưu chính trong địa chỉ thay đổi theo từng nước. Hoa Kỳ đặt sau tên bang và thành phố, Đức và Pháp đặt trước thành phố, Nhật Bản đặt lên đầu và thường kèm ký hiệu riêng, còn Hồng Kông và một số nước Trung Đông thì hoàn toàn không có khái niệm mã bưu chính.
Bản thân quy tắc cũng khác rất xa. Có nước dùng toàn chữ số với số chữ số cố định, có nước cho phép chữ cái, có nước cho phép dấu cách hoặc dấu gạch ngang làm ký tự phân tách, và có nước quy định số chữ số theo khoảng chứ không theo một độ dài cố định.
Bốn câu hỏi cần trả lời cho trường mã bưu chính là: số chữ số, tập ký tự, có cho phép ký tự phân tách hay không, và vị trí của mã trong địa chỉ. Nếu hệ thống có chức năng tra ngược khu vực từ mã bưu chính, cần kiểm tra thêm xem mã đó có thật sự khớp với thành phố và đơn vị hành chính hay không. Ba trường này nếu lấy từ ba nguồn khác nhau ở tầng dữ liệu thì rất dễ tạo ra những bản ghi mâu thuẫn nhau.
Có thể dùng danh mục quốc gia để xác nhận trước những quốc gia và vùng lãnh thổ nào đã có dữ liệu, tránh đem một mẫu không có dữ liệu hỗ trợ ra kiểm thử. Quy tắc chi tiết của từng nước được tổng hợp ở bài định dạng mã bưu chính của các quốc gia.
Số điện thoại khác nhau ở những điểm nào?
Đây là phần khác biệt lớn nhất, và có thể tách thành bốn câu hỏi độc lập. Trả lời sai một câu là đủ để sinh ra lỗi ở toàn bộ một nhóm quốc gia.
- Mã quốc gia được biểu diễn thế nào. Định dạng quốc tế thường có dấu cộng, còn định dạng nội địa thì không. Khi lưu trữ, việc tách riêng hay ghép chung sẽ quyết định bạn có chuẩn hóa được một cách ổn định hay không.
- Có giữ tiền tố gọi nội địa hay không. Số nội địa của Anh, Đức, Nhật Bản và Pháp thường có một số 0 ở đầu, và khi viết ở định dạng quốc tế thì phải bỏ số 0 đó đi. Trong khi đó chữ số của Ý vốn đã bắt đầu bằng số 0, nên khi viết ở định dạng quốc tế lại không được bỏ. Đây là nguồn lỗi phổ biến nhất khi kiểm thử số quốc tế, và kiểm thử cục bộ thì không bao giờ phát hiện ra.
- Số chữ số. Hoa Kỳ và Canada dùng mười chữ số, số di động Trung Quốc mười một chữ số, số di động Nhật Bản mười một chữ số, Hàn Quốc mười đến mười một chữ số, Ấn Độ mười chữ số, Brasil mười đến mười một chữ số, còn số điện thoại cố định của Đức có số chữ số thay đổi. Dùng một độ dài chung để kiểm tra sẽ cho kết quả sai ở phần lớn các quốc gia.
- Quy tắc về tiền tố. Số di động Trung Quốc bắt đầu bằng những dải số cố định, chữ số đầu của số di động Ấn Độ thường từ sáu đến chín, mã vùng của Brasil gồm hai chữ số. Những số có tiền tố sai vẫn vượt qua ở nơi chỉ kiểm tra độ dài, nhưng sẽ bị từ chối khi hệ thống tra cứu được nguồn gốc số.
Mối liên hệ giữa số điện thoại và địa chỉ cũng cần được kiểm thử riêng, vì mã vùng không phải lúc nào cũng khớp với địa chỉ khai báo. Bài số điện thoại và địa chỉ có luôn khớp với nhau đi sâu vào trường hợp này.
Khi nào cần kiểm tra riêng theo từng quốc gia?
Nếu sản phẩm chỉ phục vụ một quốc gia thì không cần. Nhưng khi xuất hiện quốc gia thứ hai, việc kiểm tra theo một quy tắc chung sẽ bắt đầu cho kết quả sai, và biểu hiện thường gặp là dữ liệu hợp lệ bị từ chối — khó phát hiện hơn nhiều so với việc dữ liệu không hợp lệ được chấp nhận.
Cách dung hòa là tách việc kiểm tra thành hai tầng. Tầng thứ nhất là kiểm tra nới lỏng dùng chung cho mọi quốc gia: không được để trống, giới hạn độ dài tối đa, không chứa ký tự không hợp lệ. Tầng thứ hai là kiểm tra nghiêm ngặt theo từng quốc gia, chỉ bật khi bạn thật sự biết quy tắc của quốc gia đó.
| Tầng kiểm tra | Phạm vi áp dụng | Ví dụ điều kiện |
|---|---|---|
| Nới lỏng | Mọi quốc gia | Không để trống, độ dài tối đa, ký tự hợp lệ |
| Nghiêm ngặt | Một quốc gia cụ thể | Số chữ số, tập ký tự, tiền tố, khớp với đơn vị hành chính |
Với mã đơn vị hành chính, nên dùng một trường trung tính và để quy tắc kiểm tra phụ thuộc vào quốc gia, như trình bày ở bài mã quốc gia và mã đơn vị hành chính.
Mẫu tối thiểu cần kiểm thử cho mỗi quốc gia
Bộ mẫu tối thiểu nên có ít nhất một dòng cho mỗi kiểu khác biệt, không cần nhiều dòng cho mỗi nước.
- Trung Quốc: ba cấp tỉnh, thành phố, quận viết liền; số di động mười một chữ số với dải số hợp lệ; mã bưu chính sáu chữ số.
- Nhật Bản: tỉnh hoặc phủ đứng trước; cách viết mã bưu chính kèm ký hiệu riêng; số di động mười một chữ số; bỏ số 0 ở đầu khi viết theo định dạng quốc tế.
- Hàn Quốc: hai cách viết, địa chỉ theo tên đường và địa chỉ theo sổ địa chính cũ.
- Hoa Kỳ: số nhà đứng đầu; mã bang viết tắt hai ký tự; mã bưu chính năm chữ số hoặc năm chữ số cộng bốn; số di động mười chữ số và không kèm mã quốc gia.
- Đức: thứ tự giữa tên đường và số nhà; mã bưu chính năm chữ số đặt trước thành phố; cách xử lý số 0 ở đầu khi chuyển sang định dạng quốc tế.
- Brasil: cách viết mã bưu chính chín chữ số kèm dấu gạch ngang; mã vùng hai chữ số.
- Ấn Độ: khoảng giá trị của chữ số đầu trong số di động mười chữ số; hai cách viết địa chỉ bằng tiếng Anh và bằng chữ bản địa.
Nên lưu số điện thoại ở định dạng nào?
Hãy lưu ở dạng đã chuẩn hóa, thường là mã quốc gia cộng với phần chữ số thuần, không có dấu cách, dấu gạch ngang và số 0 ở đầu. Những trường hợp ngoại lệ như Ý cần xử lý riêng. Đồng thời vẫn giữ một trường lưu nội dung gốc mà người dùng đã nhập.
Cách này vừa bảo đảm việc truy vấn và loại bỏ trùng lặp ổn định, vừa cho phép khôi phục đúng kiểu hiển thị ban đầu khi cần. Khi kiểm thử, phải bao phủ cả hai chiều chuyển đổi giữa hai dạng đó, không chỉ một chiều.
Sự khác biệt giữa dạng hiển thị và dạng lưu trữ cũng là một nguồn lỗi riêng. Một số điện thoại có thể được hiển thị đúng như người dùng đã nhập, nhưng khi lưu thì cần dạng đã chuẩn hóa, và cả hai chiều đều cần mẫu kiểm thử.
Những điểm dễ bị bỏ sót
Ngoài các mục ở trên, một vài chi tiết nhỏ thường bị đưa vào kiểm thử quá muộn.
Thứ nhất là mã quốc gia dạng tự do. Nếu ô nhập cho phép người dùng gõ tên quốc gia bằng bất kỳ ngôn ngữ nào, hệ thống phải quyết định rõ là lưu văn bản tự do hay quy đổi về mã có kiểm soát, vì mọi bước kiểm tra phía sau đều phụ thuộc vào quyết định đó.
Thứ hai là những quốc gia không có mã bưu chính. Trường mã bưu chính không thể là bắt buộc với mọi quốc gia, và hành vi mong đợi khi người dùng nhập một mã trông giống mã nước ngoài vào hồ sơ của quốc gia không dùng mã bưu chính cũng cần được quy định rõ ràng thay vì để mặc định.
Thứ ba là vấn đề phiên âm. Với biểu mẫu dành cho người dùng quốc tế, ô địa chỉ được mong đợi là chữ viết bản địa hay bản chuyển tự Latinh, và hai dạng này không thể kiểm tra lẫn lộn. Bộ mẫu kiểm thử nên chứa đồng thời cả hai dạng.
Bước tiếp theo
Hãy chọn ba quốc gia có cách viết địa chỉ khác nhau, tạo mẫu cho từng nơi bằng trình tạo địa chỉ giả, rồi dán lần lượt vào biểu mẫu để xem hệ thống có phân tích đúng khi thứ tự dòng thay đổi hay vẫn ngầm giả định rằng dòng đầu tiên là thành phố. Sau đó mở rộng bằng một mẫu số điện thoại có tiền tố nội địa cần bỏ và một mẫu số điện thoại cần giữ nguyên số 0.
Nếu bạn muốn bắt đầu từ phần nền tảng trước, bài định dạng địa chỉ quốc tế giải thích vì sao thứ tự dòng và tên trường hành chính thay đổi theo quốc gia, còn bài này có thể dùng như bảng đối chiếu khi đi từng nhóm khác biệt.