Blog về kiểm thử ·

Giá trị biên và lớp tương đương: áp dụng thế nào trong thực tế

Không thể kiểm hết mọi giá trị có thể của một ô: chúng quá nhiều. Hai kỹ thuật cùng nhau giải bài này — lớp tương đương rút gọn danh sách, phân tích biên nói cho bạn biết trong số còn lại nên kiểm cái nào trước.

Lớp tương đương: vì sao một giá trị là đủ

Ô «số lượng» nhận các số từ 1 đến 99. Thử lần lượt 1, rồi 2, rồi 3 thì vô nghĩa: dịch vụ xử lý chúng y hệt nhau. Mọi giá trị mà chương trình đối xử giống nhau tạo thành một lớp — và một đại diện của lớp là đủ.

Thường có ba lớp: giá trị hợp lệ, giá trị dưới khoảng và trên khoảng. Bên cạnh đó là các lớp riêng cho kiểu dữ liệu khác — ô trống, chuỗi thay vì số, số lẻ thay vì số nguyên, và hoàn toàn không có ô đó. Cái cuối hay bị quên, mà nó hành xử khác với ô trống.

Biên: chỗ hỏng thường xuyên nhất

Lỗi hiếm khi nằm giữa khoảng. Chúng nằm ở mép, vì đó là chỗ lập trình viên phải chọn giữa «lớn hơn» và «lớn hơn hoặc bằng» — và có thể lệch đi một đơn vị. Sai sót đó được gọi đúng như vậy: lệch một đơn vị.

ISTQB phân biệt BVA hai giá trị và ba giá trị. Cách hai giá trị lấy boundary và giá trị gần nhất của partition bên cạnh: 0 và 1, rồi 99 và 100. Cách ba giá trị thêm giá trị gần nhất bên trong partition hợp lệ: 2 và 98. Cách này tốn hơn nhưng bắt được nhiều biến thể off-by-one hơn.

Ô «số lượng», hợp lệ 1–99
  • 0 dưới mép chờ bị từ chối
  • 1 chính cái mép chờ thành công
  • 2 trong khoảng chờ thành công
  • 98 trong khoảng chờ thành công
  • 99 chính cái mép chờ thành công
  • 100 trên mép chờ bị từ chối

Biên nấp ở đâu trong API

Con số là trường hợp dễ thấy nhất nhưng không phải duy nhất. Gần như thứ gì có kích thước, độ dài hay thời hạn đều có biên.

  • Kích thước trang: per_page=0, 1, mức tối đa, tối đa + 1. Hay gặp nhất là tham số bị lặng lẽ bỏ qua, và dịch vụ trả về tất cả một lượt.
  • Độ dài văn bản: chuỗi rỗng, một ký tự, mức tối đa theo yêu cầu, tối đa + 1. Và riêng một trường hợp: chỉ toàn dấu cách — về hình thức chuỗi không rỗng.
  • Khoảng ngày: đầu bằng cuối, đầu muộn hơn cuối, khoảng dài đúng một ngày, ngày ở tương lai.
  • Tiền: số không, số nhỏ nhất, dư một xu so với số dư, phần thập phân dài hơn hai chữ số.
  • Tần suất thao tác: yêu cầu cuối cùng được phép trong cửa sổ và cái ngay sau nó — cái đáng lẽ phải bị từ chối.

Một phép kiểm biên trông như thế nào

Ý nghĩa là đổi đúng một giá trị rồi so sánh các phản hồi. Nếu ở mép và vượt mép dịch vụ trả lời như nhau thì nghĩa là không hề có phép kiểm — và đó là lỗi, bất kể trên màn hình nó trông ra sao.

Ba yêu cầu liên tiếp, đổi một chữ số
GET /products?per_page=50   → 200, 50 phần tử trong data
GET /products?per_page=51   → chờ 422
GET /products?per_page=0    → chờ 422

Kết quả mong đợi cho từng dòng lấy từ yêu cầu, không phải từ cái bạn quan sát được. Nếu yêu cầu không nêu mức tối đa thì bản thân đó đã là một phát hiện: không có chặn trên, một yêu cầu có thể đòi cả danh mục một lượt.

Những gì các kỹ thuật này không bắt được

Biên và lớp làm việc với từng ô một. Những lỗi sinh ra từ sự kết hợp của nhiều ô — giảm giá cộng số lượng cộng tồn kho — sẽ không lộ ra theo cách này: chúng cần kỹ thuật khác và đơn giản là sự chú ý tới cách các giá trị ảnh hưởng lẫn nhau.

Chúng cũng không nói gì về quyền truy cập, hay về chuyện gì xảy ra khi cùng một yêu cầu được gửi lại. Đó là những loại kiểm tra riêng, và biên chỉ là chỗ để bắt đầu vì nó cho nhiều phát hiện nhất trong thời gian ít nhất.

Tạo bộ test từ requirement

Hãy viết partition trước khi chọn value. Với “discount là số nguyên từ 0 đến 30”, các partition gồm số nguyên hợp lệ, dưới 0, trên 30, số thập phân, string, null và missing. Boundary chỉ áp dụng cho partition có thứ tự; string và null là class riêng chứ không phải hàng xóm số học.

Bộ kiểm gọn và có lý do
-1 → dưới khoảng, reject\n0  → boundary dưới, accept\n1  → bên trong, accept (chỉ 3-value BVA)\n29 → bên trong, accept (chỉ 3-value BVA)\n30 → boundary trên, accept\n31 → trên khoảng, reject\n2.5, "10", null, missing → partition riêng

Một representative chỉ đủ khi model xử lý giống nhau là hợp lý. Nếu 0 có business meaning riêng hoặc 30 kích hoạt rule promotion khác, đó là partition riêng.

Giới hạn của kỹ thuật và cách bổ sung

Equivalence là model, không phải fact hệ thống buộc phải tuân theo. Hãy sửa partition sau mỗi finding: defect thường làm lộ boundary ẩn bên trong class đã giả định.

  • Kết hợp field: dùng decision table hoặc pairwise khi nhiều condition quyết định kết quả.
  • Chuyển status: dùng state-transition testing thay vì các value độc lập.
  • Permission và ownership: lập matrix actor × action × object.
  • Date/time: làm rõ timezone, boundary có inclusive không và chuyển daylight saving.
  • Money: làm rõ đơn vị lưu, rounding, currency và precision trước khi chọn value.

Câu hỏi thường gặp về boundary

Luôn cần ba giá trị ở boundary không?

Không. BVA hai giá trị lấy boundary và value gần nhất của partition bên cạnh. BVA ba giá trị thêm value ở phía còn lại. Chọn theo risk và độ mạnh coverage cần thiết.

Empty string và missing field có cùng partition không?

Không nhất thiết. Empty string được gửi rõ ràng, null có thể nghĩa là không có value, còn missing có thể kích hoạt default hoặc required validation. Hãy kiểm riêng nếu contract chưa chứng minh xử lý giống nhau.

Có dùng BVA cho enum được không?

Enum không có thứ tự số tự nhiên nên thường không áp dụng BVA. Hãy kiểm value hợp lệ, unknown value, chữ hoa thường và trường hợp field vắng mặt.

Kỹ thuật không thấm sau lần đọc đầu. Nó thấm sau khi bạn kiểm cùng một cái biên trong bộ lọc, trong kích thước trang và trong hạn mức mỗi ngày — rồi thấy rằng lần nào cũng là một phép kiểm y hệt.

Luyện trên dịch vụ đang chạy Bài tiếp theo

← Tất cả bài viết