Kiểm thử phần mềm

Tái lập kiểm thử ngẫu nhiên bằng seed và mẫu đầu vào

Giải thích vì sao lưu seed cần đi cùng phiên bản bộ sinh và dữ liệu gây lỗi.

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

Thích và đánh giá Bình luận và hỏi đáp
JSON được in ra màn hình; cần lưu vào tệp hoặc báo cáo để dùng hồi quy.
JSON được in ra màn hình; cần lưu vào tệp hoặc báo cáo để dùng hồi quy. Mở hình lớn ↗

1. Một seed chưa mô tả toàn bộ phép thử

Seed khởi tạo trạng thái của bộ sinh. Chuỗi kết quả còn phụ thuộc việc gọi những hàm nào, thứ tự gọi và thuật toán sinh dữ liệu ở bên ngoài. Nếu thêm một lần gọi ngẫu nhiên trước khi tạo đầu vào, các giá trị sau đó có thể khác dù seed giữ nguyên. Kịch bản kiểm thử chạy đồng thời còn có thể thay đổi thứ tự tiêu thụ số.

2. Tách bộ sinh theo mục đích

Dùng một đối tượng Random riêng cho dữ liệu ca thử để tránh mã ghi log hoặc sinh màu giao diện dùng chung trạng thái. Ghi phiên bản bộ sinh, tham số miền và phiên bản môi trường khi cần tái lập chuỗi. Tài liệu Python mô tả phạm vi bảo đảm tái lập, vì vậy không nên giả định mọi hàm tiện ích giữ nguyên thuật toán qua mọi phiên bản.

3. Lưu trực tiếp mẫu gây lỗi

Mẫu Python dùng seed 17 rồi tạo tám số. Chạy lại cùng quá trình cho cùng dãy trong môi trường kiểm tra. Chèn một bước lấy số ngẫu nhiên làm dãy thay đổi. Chương trình tuần tự hóa seed, phiên bản bộ sinh và đầu vào thành JSON, rồi in ra màn hình; nó chưa ghi tệp. Sao chép JSON này vào báo cáo hoặc tệp dữ liệu hồi quy để giữ mẫu cụ thể mà không cần chạy lại quá trình tìm lỗi.

Chạy ví dụ bằng python test_tai_lap_bo_sinh.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_tai_lap_bo_sinh.pyTải mã nguồn
import json
from random import Random

def sinh(seed, chen_buoc=False):
    rng = Random(seed)
    if chen_buoc:
        rng.random()
    return [rng.randrange(0, 10) for _ in range(8)]

seed = 17
ban_dau = sinh(seed)
assert ban_dau == sinh(seed)
assert ban_dau != sinh(seed, chen_buoc=True)
luu = json.dumps({"seed": seed, "input": ban_dau, "generator": "v1"}, ensure_ascii=False)
doc_lai = json.loads(luu)
assert doc_lai["input"] == ban_dau
print("Ảnh chụp mẫu JSON", luu)

4. Thiết kế quy trình tìm và lưu lỗi

Khi gặp lỗi, trước hết lưu đầu vào và thông tin triển khai. Sau đó thu nhỏ mẫu bằng một oracle ổn định, luôn giữ một bản gốc để đối chiếu. Tách số ca đã chạy khỏi số mẫu khác nhau vì một bộ sinh có thể tạo trùng. Nếu sửa cách sinh dữ liệu, đánh giá lại độ phủ và khả năng tìm lỗi trên cùng ngân sách.

Đọc thêm Phạm vi tái lập bộ sinh trong tài liệu Python.