Kiểm thử phần mềm

Thu nhỏ dữ liệu tái hiện lỗi bằng cách loại từng phần

Tách thao tác gây lỗi khỏi dữ liệu nhiễu và kiểm tra giới hạn của phép thu nhỏ tham lam.

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

Thích và đánh giá Bình luận và hỏi đáp
Tối tiểu theo xóa một phần tử; chưa chắc ngắn nhất trong mọi chuỗi.
Tối tiểu theo xóa một phần tử; chưa chắc ngắn nhất trong mọi chuỗi. Mở hình lớn ↗

1. Định nghĩa lỗi mục tiêu trước khi thu nhỏ

Một bộ dữ liệu dài có thể gây lỗi vì hai thao tác cách xa nhau. Chọn tín hiệu đủ cụ thể, chẳng hạn loại ngoại lệ và điểm phát sinh. Nếu chỉ giữ mọi dữ liệu làm chương trình báo lỗi, thao tác thu nhỏ có thể chuyển sang lỗi cú pháp khác và không còn tái hiện vấn đề ban đầu.

2. Thử bỏ từng phần và lặp lại

Ví dụ lỗi xuất hiện khi bật bộ nhớ đệm rồi nhập lại dữ liệu theo đúng thứ tự, nếu giữa hai bước không có thao tác dọn bộ đệm. Thử xóa lần lượt các phần, chỉ giữ phép xóa còn tái hiện. Sau mỗi lần xóa thành công, duyệt lại vì việc thay đổi dữ liệu có thể làm một phần tử khác trở nên dư.

3. Kiểm tra kết quả tối tiểu cục bộ

Mã thu được hai thao tác. Bỏ riêng bất kỳ thao tác nào thì không còn lỗi. Đây là kết luận 1-minimal theo phép xóa, chưa bảo đảm dữ liệu ngắn nhất trong mọi ứng viên. Có trường hợp phải xóa đồng thời hai phần thì lỗi mới xuất hiện trở lại, trong khi bỏ riêng từng phần làm lỗi biến mất.

Chạy ví dụ bằng python test_thu_nho_du_lieu_loi.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_thu_nho_du_lieu_loi.pyTải mã nguồn
def loi_muc_tieu(thao_tac):
    cache = False
    for ten in thao_tac:
        if ten == "bat_cache":
            cache = True
        if ten == "don_cache":
            cache = False
        if ten == "nhap_lai" and cache:
            return True
    return False

def thu_nho(du_lieu):
    assert loi_muc_tieu(du_lieu)
    while True:
        for i in range(len(du_lieu)):
            ung_vien = du_lieu[:i] + du_lieu[i + 1:]
            if loi_muc_tieu(ung_vien):
                du_lieu = ung_vien
                break
        else:
            return du_lieu

ket_qua = thu_nho(["mo", "bat_cache", "cuon", "nhap_lai", "dong"])
assert ket_qua == ["bat_cache", "nhap_lai"]
assert all(not loi_muc_tieu(ket_qua[:i] + ket_qua[i+1:]) for i in range(len(ket_qua)))
print(ket_qua)

4. Tăng hiệu quả với dữ liệu có cấu trúc

Có thể bỏ cả khối trước, sau đó thu nhỏ bên trong khối. Với chuỗi gọi API, cần giữ phụ thuộc tạo tài nguyên và mã định danh. Ghi số lần chạy oracle, kích thước đầu vào trước và sau, cùng các ứng viên không thực thi được. So hai chiến lược trên cùng lỗi và dùng bộ ca thu nhỏ làm ca hồi quy.

Đọc thêm Nghiên cứu về thu nhỏ đầu vào gây lỗi của Zeller và Hildebrandt.