Menu

Mở rộng dữ liệu thử giữa các quốc gia: bất biến và danh sách ngoại lệ

Khi số quốc gia trong tập dữ liệu thử tăng lên, cách viết kiểm thử phải đổi. Bài này bàn về bất biến, danh sách ngoại lệ và cách giữ việc sinh dữ liệu lặp lại được.

Đăng ngày

  • mở rộng
  • dữ liệu thử
  • quy trình

Khi tập dữ liệu thử mới có vài quốc gia, ai cũng có thể nhớ hết các trường hợp đặc biệt. Nhưng khi con số đó tăng lên, cách làm dựa vào trí nhớ sẽ sụp đổ rất nhanh. Bài này bàn về việc chuyển từ việc nhớ sang việc ghi lại, và vì sao hai thứ cần được tách ra: phần đúng ở mọi nơi và phần chỉ đúng ở một số nơi.

Mở rộng từ vài quốc gia lên vài chục quốc gia khó ở chỗ nào?

Khó khăn đầu tiên là số lượng tổ hợp tăng nhanh hơn số lượng nơi. Nếu mỗi nơi có vài đặc điểm riêng, thì số tình huống cần kiểm thử là tích của các đặc điểm đó, chứ không phải tổng. Đây là lý do các bộ kiểm thử thường phình ra rất nhanh khi thêm nơi mới.

Khó khăn thứ hai là kiến thức nằm trong đầu người viết chứ không nằm trong mã. Khi người đó rời đi hoặc đổi việc, những trường hợp đặc biệt mà họ đã xử lý cũng biến mất theo, và lỗi cũ có thể quay lại.

Khó khăn thứ ba là việc sửa một quy tắc chung có thể phá vỡ những trường hợp riêng. Khi bạn thắt chặt một phép kiểm tra để sửa lỗi ở một nơi, bạn có thể vô tình làm hỏng dữ liệu hợp lệ ở nơi khác mà không biết.

Khó khăn thứ tư là chi phí chạy kiểm thử. Khi tập dữ liệu lớn lên, thời gian chạy tăng, và điều đó khiến người viết bắt đầu bỏ bớt ca kiểm thử. Bỏ bớt một cách tùy tiện là cách nhanh nhất để mất khả năng phát hiện lỗi.

Điểm chung của bốn khó khăn này là chúng đều đến từ việc không phân biệt phần chung với phần riêng. Vì vậy cách xử lý bắt đầu từ việc phân loại.

Chia khẳng định thành bất biến và danh sách ngoại lệ

Bất biến là điều đúng với mọi nơi, không có trường hợp ngoại lệ. Ví dụ đơn giản nhất là dữ liệu được sinh ra phải đọc lại được, hoặc mọi bản ghi đều phải có một khoá ổn định. Bất biến không cần điều kiện, và đó chính là giá trị của nó.

Danh sách ngoại lệ là những điều chỉ đúng với một số nơi. Mỗi mục trong danh sách này cần ba thứ: nơi áp dụng, nội dung ngoại lệ, và lý do. Thiếu lý do, mục đó sẽ sớm trở thành một dòng không ai dám xoá.

Loại khẳng định Áp dụng cho Cách viết Khi thay đổi
Bất biến Mọi nơi Một dòng, không điều kiện Sửa một chỗ, mọi nơi cùng theo
Ngoại lệ có lý do Một số nơi được nêu tên Một mục kèm nơi áp dụng và lý do Xem lại từng nơi bị ảnh hưởng
Ngoại lệ tạm thời Một nơi, trong một thời hạn Một mục kèm ngày hết hiệu lực Phải được xoá hoặc gia hạn có ý thức

Việc phân loại này có một lợi ích ít được nhắc tới: nó làm cho số lượng ngoại lệ trở thành một con số có thể theo dõi. Nếu con số đó tăng đều qua mỗi lần thêm nơi, có thể phần bất biến của bạn đang được viết quá hẹp.

Ngược lại, nếu mọi thứ đều được coi là bất biến, bạn sẽ gặp những ca kiểm thử đỏ mà không ai hiểu vì sao. Khi đó người ta thường sửa ca kiểm thử thay vì sửa mã, và bộ kiểm thử dần mất giá trị.

Một cách làm hữu ích là định kỳ đọc lại toàn bộ danh sách ngoại lệ và hỏi xem mục nào đã có thể trở thành bất biến. Mỗi lần như vậy, bạn có thể gỡ được một mục và làm hệ thống đơn giản hơn.

Việc sinh dữ liệu phải lặp lại được

Nếu dữ liệu thử được sinh ra khác nhau ở mỗi lần chạy, mọi kết luận rút ra từ nó đều không đáng tin. Vì vậy tính lặp lại là điều kiện tiên quyết để mở rộng.

Cách đơn giản nhất là cho mỗi lần sinh một hạt giống cố định, và ghi hạt giống đó vào kết quả. Khi cần điều tra, bạn dùng lại đúng hạt giống đó và tái hiện được nguyên trạng.

Điều cần tránh là việc sinh dữ liệu phụ thuộc vào thời điểm chạy hoặc vào thứ tự các bước. Những phụ thuộc như vậy không gây lỗi ngay, nhưng chúng làm cho việc chẩn đoán trở nên rất khó về sau.

Một điểm nữa là dữ liệu sinh ra phải được đặt tên theo cách đọc được. Nếu các bản ghi chỉ có khoá tự sinh, người đọc sẽ không biết bản ghi nào đang kiểm tra điều gì. Thêm một nhãn mô tả ngắn giúp ích rất nhiều.

Cuối cùng, hãy coi bộ sinh dữ liệu là một phần của sản phẩm. Nó cần được kiểm thử, và nó cần được sửa khi dữ liệu tham chiếu thay đổi. Nhiều nhóm chỉ kiểm thử phần sản phẩm mà quên mất phần sinh dữ liệu, rồi gặp lỗi khi bộ sinh bị lệch khỏi thực tế.

Khi nào nên lấy mẫu thay vì làm toàn bộ

Làm toàn bộ mọi tổ hợp là điều không khả thi khi số nơi tăng lên. Vì vậy cần chọn trước tiêu chí lấy mẫu, và ghi tiêu chí đó lại.

Một cách lấy mẫu tốt là chọn theo đặc điểm chứ không theo tên nơi. Ví dụ bạn chọn một nơi có nhiều ngôn ngữ chính thức, một nơi có dữ liệu hành chính nhiều cấp, và một nơi có tên gọi thay đổi gần đây. Cách này giúp mẫu của bạn đại diện cho các trường hợp cần quan tâm hơn là một danh sách tuỳ ý.

Cách lấy mẫu cũng nên có phần ngẫu nhiên có kiểm soát, để không bỏ sót những nơi không ai nghĩ tới. Phần ngẫu nhiên này cần chạy lại được, nghĩa là hạt giống của nó phải được ghi lại.

Đối với một số nhóm kiểm tra, ví dụ những kiểm tra liên quan tới giá trị số theo từng nơi, bạn có thể xem thêm bài cách kiểm tra giá trị số hoạt động để chọn mẫu theo đúng đặc điểm cần kiểm tra.

Điều quan trọng là tiêu chí lấy mẫu phải được viết ra và xem lại định kỳ. Nếu nó không được viết, nó sẽ trôi dần, và đến một lúc bạn sẽ không còn biết mẫu của mình đang đại diện cho cái gì.

Thêm một quốc gia mới thì phải chạy những kiểm tra nào?

Đây là chỗ mà một quy trình tốt tiết kiệm được nhiều thời gian nhất. Nếu việc thêm một nơi đòi hỏi phải nhớ nhiều bước, nó sẽ bị làm thiếu.

Một danh sách kiểm tra nên bao gồm:

  • Xác nhận nơi đó đã có trong dữ liệu tham chiếu, và nó có cần ngoại lệ riêng không.
  • Kiểm tra các trường tối thiểu đã đầy đủ chưa, và ghi lại những trường còn thiếu.
  • Chạy lại phần kiểm tra chung trên toàn bộ các nơi để phát hiện tác động ngoài dự kiến.
  • Kiểm tra giao diện với tên dài và với những tên gần giống tên đã có.
  • Bổ sung ít nhất một ca kiểm thử cố định cho nơi mới, và giữ nó lại lâu dài.
  • Cập nhật tài liệu về nơi nào là chuẩn cho địa chỉ, giấy tờ và tiền tệ.

Việc chạy lại phần kiểm tra chung trên toàn bộ các nơi là bước hay bị bỏ qua nhất, và cũng là bước phát hiện được nhiều lỗi nhất. Một quy tắc mới có thể làm đổi kết luận cho những nơi đã có từ trước.

Cách kiểm tra tài liệu chuẩn cũng nên nằm trong quy trình. Nếu bạn đang giữ một bảng trạng thái độ phủ cho từng nơi, hãy cập nhật nó ngay trong cùng lần thêm nơi, thay vì để lại làm sau.

Phần dành cho nhà phát triển: đưa danh sách ngoại lệ vào quản lý phiên bản

Danh sách ngoại lệ là thứ dễ bị giữ ngoài hệ thống nhất, và đó cũng là thứ gây ra nhiều hiểu nhầm nhất khi có người mới tham gia.

Vài điểm nên chốt:

  • Giữ bất biến và ngoại lệ ở hai chỗ khác nhau, và đừng để chúng trộn vào nhau.
  • Cho mỗi ngoại lệ một lý do, một nơi áp dụng, và một mốc xem lại.
  • Ghi hạt giống của mọi lần sinh dữ liệu, để việc tái hiện luôn làm được.
  • Coi bộ sinh dữ liệu là thành phần cần kiểm thử, không chỉ là công cụ phụ trợ.
  • Ghi lại số lượng ngoại lệ theo thời gian, và xem việc nó tăng là một tín hiệu cần xem lại.

Bạn có thể mở danh mục quốc gia và vùng lãnh thổ để đối chiếu khi rà lại danh sách nơi đang có trong tập dữ liệu. Cấu trúc bất biến và danh sách ngoại lệ nêu trong bài chỉ là ví dụ minh hoạ cho cách tổ chức công việc; chúng không mô tả hệ thống thật của bất kỳ tổ chức nào, không gắn với cá nhân nào, và không dùng được làm bằng chứng cho kết quả kiểm thử thực tế.

Bước tiếp theo

Hãy thử viết ra ba bất biến đúng với mọi nơi trong hệ thống của bạn, rồi liệt kê những ngoại lệ đang tồn tại. Số ngoại lệ bạn tìm được thường là thước đo tốt cho mức độ phức tạp thật sự của bài toán. Sau đó, bài danh sách độ phủ dữ liệu theo quốc gia hướng dẫn cách theo dõi từng ô còn thiếu, còn bài độ mới của dữ liệu quốc gia bàn về việc giữ dữ liệu tham chiếu khỏi lùi dần theo thời gian.

Đọc tiếp

Bài viết về Định dạng địa chỉ và danh tính theo quốc gia