Fixture kiểm thử là phần dữ liệu cố định mà bài kiểm thử đọc vào, để mỗi lần chạy đều bắt đầu từ cùng một điểm. Với dữ liệu danh tính, đây là thứ quyết định một lỗi có tái hiện được hay không. Bài này nói về cách tổ chức bộ dữ liệu đó, những mẫu nên có sẵn, và cách giữ nó không bị mục theo thời gian.
Fixture kiểm thử khác gì dữ liệu sinh ngẫu nhiên?
Dữ liệu sinh ngẫu nhiên mỗi lần chạy một khác thì tiện cho việc thăm dò, nhưng lại khó dùng làm mốc. Nếu bài kiểm thử thất bại ở lần chạy thứ hai mươi, bạn không có cách nào biết nguyên nhân nằm ở mã hay ở dữ liệu, vì dữ liệu đã khác đi.
Fixture đi theo hướng ngược lại. Nó là một tập giá trị được chọn trước, giữ nguyên giữa các lần chạy, và thường được đặt tên theo tình huống mà nó đại diện. Nhờ vậy, khi một bài kiểm thử đỏ, bạn biết chắc dữ liệu đầu vào không đổi, và lỗi nằm ở phía mã.
Cách phân chia thực dụng là dùng fixture cho những trường hợp cần khẳng định chính xác, và dùng dữ liệu sinh tự động cho những bài kiểm thử chỉ cần dữ liệu đúng định dạng với số lượng lớn.
Vì sao dữ liệu sinh mỗi lần một khác lại khó sửa lỗi?
Vì nó phá vỡ khả năng lặp lại. Một báo cáo lỗi chỉ có giá trị khi người khác mở máy lên và gặp đúng hiện tượng đó. Nếu đầu vào thay đổi sau mỗi lần chạy, người nhận báo cáo không tái hiện được, và cuộc trao đổi sẽ xoay quanh việc dữ liệu có giống nhau hay không thay vì xoay quanh nguyên nhân.
Vấn đề còn nặng hơn với dữ liệu danh tính, vì nhiều trường phụ thuộc lẫn nhau. Một lần chạy có thể sinh ra hồ sơ có họ ghép dài, lần sau ra hồ sơ chỉ một tên, và hai lần đó đi vào hai nhánh xử lý khác nhau trong giao diện. Bạn tưởng mình đang kiểm thử cùng một thứ, nhưng thực ra không.
Cách khắc phục không nhất thiết là bỏ hẳn dữ liệu sinh tự động. Chỉ cần sinh nó một lần, chốt lại thành fixture, và ghi lại đầu vào đã dùng để sinh. Như vậy bạn vừa có dữ liệu đa dạng, vừa giữ được khả năng tái lập.
Nên đặt tên và tổ chức bộ dữ liệu thế nào?
Nguyên tắc dễ nhớ là đặt tên theo tình huống, không theo giá trị. Một bản ghi tên là hồ sơ người nước ngoài có thể dùng để kiểm tra định dạng địa chỉ quốc tế, còn một bản ghi tên là nguyễn văn a thì không cho người đọc biết nó dùng làm gì.
Bộ dữ liệu cũng nên được nhóm theo mục đích sử dụng. Bảng dưới đây là một cách chia thường gặp.
| Nhóm | Dùng cho | Đặc điểm |
|---|---|---|
| Hồ sơ tối thiểu | Kiểm tra trường bắt buộc và luồng đăng ký cơ bản | Chỉ có những trường bắt buộc, các trường khác để trống |
| Hồ sơ đầy đủ | Kiểm tra hiển thị và luồng nghiệp vụ trọn vẹn | Có đủ mọi trường, giá trị dài ở mức trung bình |
| Hồ sơ biên | Kiểm tra giới hạn độ dài và định dạng | Giá trị dài nhất, ngắn nhất, hoặc ký tự đặc biệt |
| Hồ sơ sai có chủ đích | Kiểm tra thông báo lỗi | Sai đúng một trường để biết hệ thống phát hiện được |
Một chi tiết nhỏ nhưng giúp ích lâu dài: ghi kèm lý do tồn tại của từng bản ghi, trong một dòng chú thích hoặc trong tên tệp. Sáu tháng sau, người đọc sẽ biết bản ghi đó dùng cho trường hợp nào và có thể xóa an toàn hay không.
Những mẫu biên nào đáng có sẵn?
Nếu chỉ chuẩn bị được vài mẫu, hãy chọn những mẫu đã từng gây lỗi ở đâu đó. Một danh sách khởi đầu hợp lý gồm:
- Người rất lớn tuổi, vì ngày sinh lùi xa và nhiều phép tính tuổi xử lý sai.
- Tên rất dài, đặc biệt là tên ghép, để thử chỗ cắt chữ và xuống dòng.
- Người chỉ có một tên, vì trường họ có thể bị để trống một cách hợp lệ.
- Tên có ký tự ngoài bảng chữ cái Latinh, để thử lưu trữ và hiển thị.
- Bản ghi có quốc gia và địa chỉ cùng thuộc một nước, nhưng là nước ít gặp trong dữ liệu thường ngày.
Điểm chung của nhóm này là chúng buộc giao diện và phép kiểm tra phải xử lý trường hợp không nằm giữa khoảng. Đó chính là nơi lỗi trú ngụ.
Làm sao có sẵn dữ liệu nền để dựng fixture?
Thay vì tự nghĩ ra từng giá trị, bạn có thể sinh một bộ nền rồi chọn lọc. Trình tạo dữ liệu danh tính và kiểm thử trực tuyến của trang này tạo bản ghi theo quốc gia bạn chọn, gồm họ tên, ngày sinh, số giấy tờ tùy thân, địa chỉ và số điện thoại khớp nhau, và bạn có thể tạo nhiều bản liên tiếp rồi giữ lại những bản đại diện cho từng tình huống.
Dữ liệu này là dữ liệu tổng hợp, chỉ dùng cho kiểm thử phần mềm, không ứng với người có thật và không dùng để mạo danh ai. Vì nó không thuộc về ai, bạn có thể lưu nó trong kho mã nguồn mà không mang theo rủi ro về dữ liệu cá nhân, điều mà fixture lấy từ dữ liệu thật không bao giờ có được.
Muốn thử luồng nhập liệu nội địa trước, hãy sinh vài bản ở Việt Nam; muốn thử luồng quốc tế, đổi sang một nước khác và dựng thêm một nhóm fixture tương ứng.
Phần dành cho nhà phát triển
Fixture chỉ hữu ích khi nó tương ứng một-một với các ca kiểm thử. Nếu hai bài kiểm thử dùng chung một bản ghi vì tiện, việc sửa bản ghi đó để phục vụ bài này thường làm hỏng bài kia. Hãy để mỗi ca có bản ghi riêng, hoặc ít nhất ghi rõ bản ghi đang phục vụ những ca nào.
Vài điểm nên chốt:
- Chốt đầu vào sinh dữ liệu, và ghi lại đầu vào đó cạnh fixture. Khi cần thêm mẫu, bạn sinh từ cùng đầu vào đó thay vì sửa tay giá trị.
- Đặt một bài kiểm tra định kỳ xác nhận fixture vẫn đọc được và vẫn qua được các phép kiểm tra cơ bản, vì đó là cách phát hiện fixture đã mục.
- Cảnh giác với những giá trị gắn với thời gian. Một fixture có ngày sinh cố định sẽ dần trôi khỏi ngưỡng tuổi mà nó từng đại diện; hãy ghi rõ ngưỡng đó trong chú thích.
- Khi đổi định dạng dữ liệu của hệ thống, hãy cập nhật fixture trong cùng thay đổi đó, đừng để hai việc tách rời.
- Giữ fixture nhỏ và đọc được. Một tệp dữ liệu khổng lồ mà không ai dám sửa sẽ sớm trở thành thứ không ai dám xóa.
Điều cuối cùng cần nhớ là fixture không tự đúng. Nó chỉ đúng chừng nào bạn còn kiểm tra nó. Bài dữ liệu danh tính cho kiểm thử trình bày thêm về các trường và mối phụ thuộc giữa chúng, hữu ích khi bạn dựng bộ dữ liệu đầu tiên.
Bước tiếp theo
Hãy chọn ba tình huống hay gây lỗi nhất trong sản phẩm của bạn và dựng cho mỗi tình huống một bản ghi cố định, có tên gọi rõ ràng. Sau đó mở trình tạo dữ liệu danh tính để sinh phần dữ liệu nền, rồi lưu lại cùng đầu vào đã dùng, để lần sau bạn có thể tạo lại đúng bộ mẫu đó.