Trình tạo địa chỉ ngẫu nhiên là công cụ sinh ra các bản ghi địa chỉ khác nhau mỗi lần bạn yêu cầu, để bạn có nhanh một lượng dữ liệu đủ đa dạng mà thử biểu mẫu, thử bộ lọc và thử các luồng nhập liệu. Nhưng chữ ngẫu nhiên trong tên gọi dễ gây hiểu nhầm: thứ bạn thật sự cần cho kiểm thử không phải là sự bất ngờ, mà là sự đa dạng có kiểm soát, kèm khả năng sinh lại đúng bản ghi cũ khi cần truy nguyên một lỗi. Đọc hết bài này, bạn sẽ phân biệt được ngẫu nhiên với lộn xộn, hiểu vì sao tính tái lập quan trọng hơn tính bất ngờ, và biết những cái bẫy nào hay gặp khi sinh địa chỉ cho nhiều quốc gia cùng lúc.
Ngẫu nhiên khác gì với lộn xộn?
Một địa chỉ ngẫu nhiên hữu ích vẫn phải tuân theo ba ràng buộc. Thứ nhất, mọi trường trong bản ghi phải thuộc cùng một quốc gia, vì một hồ sơ có tỉnh của nước này gắn với mã bưu chính của nước kia là dữ liệu vô nghĩa chứ không phải dữ liệu đa dạng. Thứ hai, các trường phải tự nhất quán với nhau theo đúng quan hệ mà hệ thống thật áp dụng, ví dụ mã bưu chính phải thuộc tỉnh đã chọn. Thứ ba, những trường có chữ số kiểm tra phải được tính đúng, nếu không bản ghi sẽ trượt ngay ở phép kiểm tra đầu tiên và bạn sẽ tưởng lỗi nằm ở hệ thống của mình.
Ba ràng buộc này giải thích vì sao ngẫu nhiên trong bối cảnh dữ liệu kiểm thử không có nghĩa là bốc bừa. Nó có nghĩa là chọn ngẫu nhiên trong tập hợp những giá trị hợp lệ, rồi ghép chúng theo đúng quan hệ. Nếu công cụ chỉ bốc từng trường một cách độc lập, bạn sẽ nhận được những bản ghi trông rất giống dữ liệu thật ở từng trường riêng lẻ nhưng lại mâu thuẫn khi đặt cạnh nhau.
Chữ số kiểm tra là phần dễ bị xem nhẹ nhất. Rất nhiều mã định danh trong địa chỉ và trong hồ sơ đi kèm, như mã số thuế hay mã bưu chính có cấu trúc, đều chứa một chữ số được tính từ các chữ số còn lại. Một chuỗi số trông hợp lệ nhưng có chữ số kiểm tra sai sẽ bị mọi thư viện xác thực từ chối, và bạn sẽ mất thời gian đi tìm lỗi ở nơi không có lỗi. Bài tổng quan về thuật toán chữ số kiểm tra giải thích cơ chế này.
Vì sao mỗi lần tải lại trang không nên cho ra một địa chỉ mới?
Hãy tưởng tượng một buổi kiểm thử tự động thất bại ở bước thanh toán. Bạn mở lại bộ kiểm thử để xem chuyện gì xảy ra, nhưng lần chạy này hệ thống nhận một địa chỉ hoàn toàn khác, và lỗi không tái hiện nữa. Bạn vừa mất khả năng truy nguyên, và tệ hơn, bạn không biết lỗi đã biến mất vì nguyên nhân đã được sửa hay chỉ vì dữ liệu đầu vào đã đổi.
Đây là lý do vì sao một trình tạo địa chỉ ngẫu nhiên dùng cho kiểm thử nên hoạt động theo cơ chế khóa sinh. Cùng một khóa và cùng một quốc gia phải luôn cho ra cùng một bản ghi, còn khi bạn đổi khóa thì bản ghi mới xuất hiện. Với cơ chế đó, bạn có được cả hai thứ cùng lúc: sự đa dạng để thử nhiều trường hợp, và sự ổn định để tái hiện một trường hợp bất kỳ.
Cách làm này cũng giúp việc gỡ lỗi trở nên rẻ hơn nhiều. Khi một bản ghi gây lỗi, bạn ghi lại khóa sinh của nó vào báo cáo lỗi, và bất kỳ ai đọc báo cáo cũng dựng lại được đúng bản ghi đó mà không cần chép tay toàn bộ địa chỉ. Đây chính là cách tiếp cận mà bài dữ liệu địa chỉ trong bộ dữ liệu cố định trình bày cho các dự án muốn bộ kiểm thử chạy ổn định qua nhiều tháng.
Một điểm cần chốt sớm là đừng để giao diện tự sinh lại dữ liệu mỗi khi có sự kiện nhỏ, chẳng hạn khi người dùng đổi kích thước cửa sổ hay khi trang tự tải lại. Những lần sinh lại ngoài ý muốn đó làm hỏng tính tái lập mà bạn vừa thiết lập, và chúng thường khó phát hiện vì chỉ xảy ra trong một số điều kiện giao diện nhất định.
Làm sao sinh hàng loạt bản ghi để thử theo hướng dữ liệu?
Kiểm thử theo hướng dữ liệu là cách viết một kịch bản kiểm thử rồi chạy nó với nhiều bộ đầu vào khác nhau. Cách này chỉ hiệu quả khi bạn có sẵn một tệp đầu vào đủ phong phú, và đây là lúc việc xuất hàng loạt phát huy tác dụng. Thay vì gọi công cụ từng lần một, bạn sinh một lô vài trăm bản ghi, lưu thành tệp, rồi để bộ kiểm thử đọc từ tệp đó.
Khi sinh hàng loạt, hãy nghĩ tới việc phân bổ theo quốc gia chứ không sinh đều tất cả các nước. Phần lớn hệ thống có một vài thị trường chính, nên một lô dữ liệu dùng được thường dành phần lớn dòng cho những thị trường đó và chỉ rải một ít dòng cho các nước còn lại để thử giao diện quốc tế. Nếu bạn sinh đều cho hàng chục quốc gia, bạn sẽ có rất nhiều dòng mà mỗi nước chỉ có vài dòng, không đủ để phát hiện lỗi đặc thù của nước nào.
Một chi tiết vận hành đáng lưu ý là kích thước tệp. Vài nghìn bản ghi địa chỉ ở dạng văn bản thuần thường không lớn, nên bạn có thể để tệp đó trong kho mã nguồn và xem nó như một phần của bộ kiểm thử. Cách này tốt hơn việc gọi mạng trong lúc chạy kiểm thử, vì bộ kiểm thử sẽ không phụ thuộc vào việc dịch vụ bên ngoài có phản hồi hay không.
Những cái bẫy nào hay gặp khi sinh nhiều quốc gia cùng lúc?
Cái bẫy đầu tiên là ghép sai tầng hành chính. Mỗi quốc gia có số tầng khác nhau và tên gọi khác nhau cho từng tầng, nên nếu công cụ dùng chung một mô hình cho mọi nước, nó sẽ tạo ra những bản ghi có hình dạng hợp lý nhưng không tồn tại trong hệ thống hành chính của nước đó. Hãy đối chiếu với trình tạo địa chỉ Thổ Nhĩ Kỳ để thấy một quốc gia có số tầng nhiều hơn hẳn, và với trình tạo địa chỉ Hoa Kỳ để thấy một quốc gia có số tầng ít hơn nhưng lại có nhiều loại thực thể hành chính.
Cái bẫy thứ hai là mã bưu chính không khớp với thành phố hoặc tỉnh. Đây là lỗi phổ biến nhất, và nó đặc biệt khó chịu vì bản ghi vẫn qua được phần lớn phép kiểm tra hình thức. Cách phát hiện là kiểm tra chéo ở phía bộ kiểm thử của bạn, chứ không tin rằng công cụ đã làm đúng. Việc tự kiểm tra chéo là một thói quen tốt, vì nó biến bộ kiểm thử của bạn thành một tấm lưới bắt lỗi dữ liệu.
Cái bẫy thứ ba là mã vùng điện thoại không khớp với thành phố. Tương tự mã bưu chính, mã vùng là trường dễ bị sinh rời rạc nhất vì nó nằm ngoài phần địa chỉ. Nếu bạn đang thử một luồng xác minh số điện thoại bằng tin nhắn, một số điện thoại có mã vùng sai sẽ khiến hệ thống của bạn gửi tin nhắn tới một vùng không liên quan, và trong môi trường thử thì điều đó chỉ gây nhiễu, nhưng ý nghĩa của phép kiểm tra đã mất.
Cái bẫy thứ tư là trùng lặp. Khi sinh vài nghìn dòng từ một tập giá trị không đủ lớn, bạn sẽ có những bản ghi trùng nhau. Với một số phép kiểm thử thì điều đó vô hại, nhưng với những phép kiểm thử về tính duy nhất của khách hàng thì nó làm bạn tưởng rằng hệ thống đã phát hiện trùng lặp trong khi thực ra đầu vào đã trùng sẵn. Hãy kiểm tra tần suất trùng trước khi kết luận bất cứ điều gì về hệ thống.
Dùng địa chỉ ngẫu nhiên cho thử tải và thử biên ra sao?
Trong thử tải, địa chỉ thường chỉ là một phần của bản ghi lớn hơn, nên điều bạn cần là tốc độ sinh và kích thước đủ lớn chứ không phải sự tinh tế của từng bản ghi. Một lô vài chục nghìn dòng cố định, đọc từ tệp và phân phối cho các luồng chạy song song, thường ổn định hơn nhiều so với việc gọi công cụ trong lúc chạy. Điều cần tránh là để mọi luồng dùng chung một bản ghi, vì khi đó bạn đang thử tải trên một điểm dữ liệu duy nhất và sẽ không phát hiện được vấn đề về chỉ mục hay khóa.
Trong thử biên, mục tiêu ngược lại: bạn muốn những bản ghi xấu, hiếm và khó chịu. Hãy chuẩn bị ca tên đường dài sát giới hạn, ca thành phố chỉ có một từ, ca bản ghi không có tầng nào ở giữa, ca ký tự có dấu, ca chuỗi có dấu phẩy nằm trong tên, và ca trường để trống. Những bản ghi này không nên sinh ngẫu nhiên mà nên được đặt tên và lưu riêng, vì bạn cần biết chính xác ca nào đang thất bại. Bài các ca kiểm thử biểu mẫu địa chỉ khi thanh toán có một danh sách ca biên đáng tham khảo cho mục đích này.
Một cách làm hữu ích là tách hai bộ dữ liệu: một bộ lớn sinh ngẫu nhiên để thử tải và thử phân trang, và một bộ nhỏ được đặt tên thủ công để thử biên. Trộn hai mục đích vào cùng một bộ sẽ khiến bạn khó biết mình đang kiểm tra điều gì, và khi một ca thất bại, bạn sẽ không biết đó là hành vi đúng của hệ thống trước dữ liệu xấu hay là lỗi thật.
Cần chuẩn bị những ca kiểm thử nào?
Với dữ liệu địa chỉ sinh ngẫu nhiên, hãy chuẩn bị ca bản ghi có số căn và ca không có, ca mã bưu chính có phần mở rộng và ca chỉ có phần chính, ca tầng hành chính bị thiếu và ca đầy đủ, ca trường dài sát giới hạn và ca trường ngắn, ca hai bản ghi trùng nhau và ca hai bản ghi chỉ khác một ký tự. Với mỗi ca, hãy ghi rõ kỳ vọng của hệ thống là chấp nhận, từ chối, hay cảnh báo rồi cho xác nhận.
Song song với các ca dữ liệu, hãy chuẩn bị ca về số lượng: một dòng, mười dòng, vài trăm dòng, vài nghìn dòng. Rất nhiều lỗi về phân trang, sắp xếp và xuất tệp chỉ xuất hiện khi số dòng vượt một ngưỡng nào đó, nên một bộ kiểm thử chỉ có vài bản ghi sẽ không bao giờ chạm tới chúng.
Cuối cùng, hãy ghi lại khóa sinh của từng bộ dữ liệu mà bạn dùng trong báo cáo kiểm thử. Đây là chi tiết nhỏ nhưng quyết định việc truy nguyên lỗi diễn ra trong vài phút hay vài giờ, và nó chỉ hữu ích nếu bạn ghi lại ngay lúc sinh dữ liệu chứ không phải sau khi lỗi đã xảy ra.
Bước tiếp theo
Hãy mở trình tạo địa chỉ, chọn một quốc gia, sinh vài bản ghi rồi sinh lại với cùng khóa để xác nhận rằng kết quả không đổi. Sau đó đổi khóa và kiểm tra xem các trường trong bản ghi mới có vẫn nhất quán với nhau hay không, rồi thử xuất một lô lớn hơn để đưa vào bộ kiểm thử theo hướng dữ liệu.
Toàn bộ dữ liệu do trang này sinh ra là dữ liệu kiểm thử tổng hợp: các trường tuân theo quy ước định dạng và quan hệ của quốc gia được chọn, nhưng bản ghi không ứng với người nào, nhà nào hay tài khoản nào có thật, và chỉ nên dùng cho việc thử phần mềm, thử biểu mẫu và trình diễn giao diện.