Kiểm thử phần mềm
Tái hiện kiểm thử flaky do phụ thuộc thứ tự
Dựng thí nghiệm hai thứ tự để tìm trạng thái dùng chung và kiểm chứng hiệu quả của cơ chế cô lập.
Thích và đánh giá Bình luận và hỏi đáp1. Tách tính bất định khỏi lỗi phụ thuộc thứ tự
Giả sử một bài kiểm tra thất bại ở một lượt CI rồi chạy lại thành công trên cùng bản mã. Hai lượt đó có thể đã dùng thứ tự khác, lịch thực thi khác hoặc trạng thái môi trường khác. Khi không ghi lại những yếu tố này, nhóm phát triển rất khó phân biệt lỗi phụ thuộc thứ tự với chờ thời gian, tranh chấp đồng thời, dữ liệu dùng chung và lỗi hạ tầng.
Ví dụ cố tình để hai ca dùng chung tùy chọn ngôn ngữ. Ca A đổi cấu hình sang tiếng Việt. Ca B kỳ vọng cấu hình mặc định tiếng Anh. Chạy A trước B làm B lỗi, còn chạy B trước A cho kết quả đạt. Mỗi ca đạt khi chạy một mình từ trạng thái sạch, nên thao tác chạy lại riêng B có thể che khuất chính điều kiện gây lỗi.
2. Tái hiện rồi đổi một yếu tố
Khởi tạo môi trường sạch trước mỗi lượt. Giữ cùng phiên bản mã, hai ca và cùng cấu hình, rồi chạy cả hai thứ tự. Ghi một bảng kết quả ở cấp ca, thay vì chỉ quan sát trạng thái đạt/rớt của cả lượt. Sau khi thu được lỗi ở A → B, áp dụng duy nhất một thay đổi là cấp cấu hình riêng cho mỗi ca, rồi lặp lại hai thứ tự.
Trong ví dụ, B quan sát tiếng Việt ở thứ tự đầu tiên vì trạng thái truyền từ A sang B. Sau khi cô lập, cả hai lượt đều đạt. Trong hệ thống thật, sửa ca bằng fixture mới, hoàn tác giao dịch hoặc dọn tài nguyên cần đi kèm phép kiểm chứng rằng cơ chế cô lập cũng chạy khi ca trước thất bại. Tài nguyên cấp tiến trình và cấp dịch vụ có vòng đời khác nhau nên cần kiểm tra riêng.
3. Đọc bản ghi chạy lại
Chạy bằng Python 3. Chương trình in hai lượt trước khi sửa và kiểm tra bằng assert rằng cả hai thứ tự đều thành công sau khi cô lập. Trong CI, nên lưu thứ tự thực tế, seed nếu dùng xáo trộn, phiên bản mã, worker, mức song song, múi giờ và dấu thời gian. Cùng seed có thể vẫn dẫn đến lịch chạy khác khi nhiều worker nhận ca động.
Môi trường thực hành. Python 3.10 trở lên. Ví dụ dùng thư viện chuẩn Python.
"""Tái hiện lỗi phụ thuộc thứ tự bằng trạng thái giả lập."""
from itertools import permutations
def test_tieng_viet(settings):
settings["language"] = "vi"
assert settings["language"] == "vi"
def test_ngon_ngu_mac_dinh(settings):
assert settings["language"] == "en"
TESTS = [test_tieng_viet, test_ngon_ngu_mac_dinh]
def run(order, isolate):
shared = {"language": "en"}
failures = []
for test in order:
settings = {"language": "en"} if isolate else shared
try:
test(settings)
except AssertionError:
failures.append(test.__name__)
return failures
if __name__ == "__main__":
for order in permutations(TESTS):
print([test.__name__ for test in order], "->", run(order, isolate=False))
assert run(order, isolate=True) == []
assert run(TESTS, isolate=False) == ["test_ngon_ngu_mac_dinh"]
assert run(TESTS[::-1], isolate=False) == []4. Đo hiệu quả phát hiện trên bộ ca lớn
Một hướng thử nghiệm là so sánh xáo trộn toàn bộ với lấy mẫu có chủ đích những ca cùng ghi vào một tài nguyên. Cố định ngân sách chạy, lưu các cặp thủ phạm và nạn nhân đã xác nhận, sau đó đối chiếu thời gian cần để tái hiện. Chạy các vòng theo nhiều worker riêng và báo rõ yếu tố nào đã được kiểm soát.
Tần suất lỗi quan sát được chỉ có nghĩa trong cấu hình lấy mẫu đã mô tả. Chẳng hạn, lỗi xuất hiện ở một trong hai thứ tự khả dĩ của ví dụ, nhưng điều đó không xác định xác suất lỗi trên CI khi thứ tự không đồng đều hoặc trạng thái tồn tại qua lượt. Đọc thêm phân tích thực nghiệm của Luo và cộng sự về kiểm thử flaky.