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.

Vấn đề nghiên cứuNâng cao6 phút đọcPython

Thích và đánh giá Bình luận và hỏi đáp
Phải so mỗi kết quả với oracle; không suy gần bằng qua một chuỗi trung gian.
Phải so mỗi kết quả với oracle; không suy gần bằng qua một chuỗi trung gian. Mở hình lớn ↗

1. 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.

Python · test_sai_so_va_bac_cau.pyTải mã nguồn
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.

Đọc thêm Định nghĩa math.isclose trong tài liệu Python.