Kiểm thử phần mềm

Tiêm lỗi mất phản hồi để kiểm thử gửi lại

Đo tác động khi thao tác đã ghi thành công nhưng máy khách chưa nhận xác nhận.

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

Thích và đánh giá Bình luận và hỏi đáp
Định danh yêu cầu phải đi kèm kiểm tra nội dung và phạm vi hiệu lực.
Định danh yêu cầu phải đi kèm kiểm tra nội dung và phạm vi hiệu lực. Mở hình lớn ↗

1. Đặt lỗi ở đúng phía của điểm ghi

Mất kết nối trước khi ghi và mất phản hồi sau khi ghi tạo cùng biểu hiện ở máy khách. Tác động phía máy chủ khác nhau. Ca thứ hai dễ tạo bản ghi trùng vì máy khách gửi lại mà không biết lần đầu đã thành công. Điểm tiêm lỗi phải đặt sau khi thay đổi bền vững và trước khi phản hồi tới bên gọi.

2. Phân biệt mã yêu cầu và dữ liệu nghiệp vụ

Dùng một mã ổn định cho các lần thử của cùng yêu cầu. Lưu kết quả cùng dấu vết dữ liệu đã nhận. Nếu mã cũ đi kèm dữ liệu khác, trả lỗi xung đột để phát hiện việc dùng lại nhầm mã. Hai yêu cầu thực sự độc lập vẫn có thể có nội dung giống nhau và phải dùng hai mã riêng.

3. Kiểm chứng cả kết quả lẫn số lần ghi

Ví dụ làm mất phản hồi của lần đầu, gửi lại cùng mã và xác nhận kết quả được lấy từ lần ghi trước. Bộ đếm chỉ tăng một lần. Sau đó thử lại cùng mã với số tiền khác để xác nhận hệ thống từ chối. Mô hình bộ nhớ minh họa giao thức và chưa bao quát thao tác đồng thời.

Chạy ví dụ bằng python test_loi_mat_phan_hoi.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_loi_mat_phan_hoi.pyTải mã nguồn
class SoGhi:
    def __init__(self):
        self.yeu_cau = {}
        self.tac_dong = []

    def gui(self, ma, gia_tri, mat_phan_hoi=False):
        if ma in self.yeu_cau:
            cu, ket_qua = self.yeu_cau[ma]
            if cu != gia_tri:
                raise ValueError("Mã yêu cầu có dữ liệu khác")
            return ket_qua
        self.tac_dong.append(gia_tri)
        ket_qua = len(self.tac_dong)
        self.yeu_cau[ma] = gia_tri, ket_qua
        if mat_phan_hoi:
            raise TimeoutError
        return ket_qua

so = SoGhi()
try:
    so.gui("r17", 9, mat_phan_hoi=True)
except TimeoutError:
    assert so.gui("r17", 9) == 1
else:
    raise AssertionError("Phải mất phản hồi ở lần đầu")
assert so.tac_dong == [9]
try:
    so.gui("r17", 10)
except ValueError:
    print("Một lần ghi, mã dùng lại với dữ liệu khác bị từ chối.")
else:
    raise AssertionError("Mã dùng lại phải bị từ chối")

4. Mở rộng điểm tiêm lỗi

Trong triển khai thật, thử hai yêu cầu cùng đến, lỗi ngay giữa cập nhật bản ghi nghiệp vụ và lưu mã yêu cầu, cùng trường hợp đã hết hạn giữ mã. Quan sát trạng thái bền vững, phản hồi và số lần gọi dịch vụ phụ. Việc ghi mã và tác động nghiệp vụ cần có ranh giới nhất quán rõ ràng.

Đọc thêm Thiết kế API an toàn khi gửi lại của AWS Builders’ Library.