Kiểm thử phần mềm
Thiết kế oracle số thực với sai số rõ ràng
Phân biệt sai số tương đối, tuyệt đối và giới hạn của quan hệ gần đúng.
Thích và đánh giá Bình luận và hỏi đáp1. Tránh suy luận bắc cầu từ gần đúng
Với sai số tuyệt đối 0,1, các số 0 và 0,09 đủ gần nhau, 0,09 và 0,18 cũng đủ gần nhau. Nhưng 0 và 0,18 không đủ gần. Nếu dùng một kết quả gần đúng làm kỳ vọng cho bước sau, sai số có thể tích lũy qua nhiều lần so. Nên xác định giá trị tham chiếu của từng phép kiểm tra thay vì thay dần bằng kết quả trước.
2. Chọn sai số theo miền dữ liệu
Sai số tương đối tỷ lệ theo độ lớn của giá trị. Gần 0, ngưỡng tương đối có thể quá chặt để chấp nhận nhiễu tuyệt đối nhỏ. Sai số tuyệt đối đặt một sàn sai khác cho vùng đó. Việc chọn ngưỡng cần xuất phát từ đơn vị đo, thuật toán và yêu cầu sử dụng, vì một con số nhỏ theo đơn vị này có thể lớn theo đơn vị khác.
3. Kiểm tra cả số hữu hạn và trường hợp đặc biệt
Mẫu dùng math.isclose và thêm điều kiện isfinite cho hợp đồng chỉ nhận số hữu hạn. Nó minh họa tính không bắc cầu, trường hợp gần 0, NaN và vô cực. Bản thân isclose có quy tắc cho các giá trị đặc biệt, nên lớp kiểm tra hợp đồng cần nêu rõ điều gì được chấp nhận trước khi so sai số.
Chạy ví dụ bằng python test_sai_so_va_bac_cau.py.
Môi trường thực hành. Python 3.10 trở lên. Ví dụ dùng thư viện chuẩn Python.
from math import isclose, isfinite
def gan_dung(thuc_te, ky_vong):
return isfinite(thuc_te) and isfinite(ky_vong) and isclose(thuc_te, ky_vong, rel_tol=0, abs_tol=0.1)
a, b, c = 0, 0.09, 0.18
assert gan_dung(a, b) and gan_dung(b, c)
assert not gan_dung(a, c)
assert not isclose(0, 1e-12, rel_tol=0.01, abs_tol=0)
assert isclose(0, 1e-12, rel_tol=0.01, abs_tol=1e-10)
assert not gan_dung(float("nan"), 0)
assert not gan_dung(float("inf"), float("inf"))
print("Gần đúng không bắc cầu. Sai số tuyệt đối cần thiết khi kỳ vọng gần 0.")4. So độ nhạy của bộ kiểm thử
Tạo tập lỗi cài có chủ đích, gồm đổi dấu, nhân sai hệ số và lệch một đơn vị. Chạy bộ ca dưới nhiều ngưỡng rồi báo lỗi nào bị bỏ sót và giá trị đúng nào bị báo sai. Chọn ngưỡng sau khi nhìn một lỗi cụ thể có thể làm bộ kiểm thử thiên lệch, vì vậy giữ một tập đánh giá độc lập khi cần so các cách thiết kế oracle.