Kiểm thử phần mềm

Kiểm thử hợp đồng API khi trường thiếu hoặc có giá trị null

Thiết kế bộ dữ liệu tách sự hiện diện của khóa khỏi kiểu giá trị.

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

Thích và đánh giá Bình luận và hỏi đáp
ma bắt buộc và không rỗng; ghi_chu tùy chọn nhưng nếu có phải là chuỗi.
ma bắt buộc và không rỗng; ghi_chu tùy chọn nhưng nếu có phải là chuỗi. Mở hình lớn ↗

1. Hai trạng thái dữ liệu cần hai kỳ vọng

Một phản hồi không có trường ghi_chu khác với phản hồi có ghi_chu mang null. Hợp đồng ví dụ yêu cầu ma là chuỗi khác rỗng, còn ghi_chu có thể vắng. Nếu xuất hiện, ghi_chu phải là chuỗi, kể cả chuỗi rỗng. Do đó null bị từ chối dù trường không bắt buộc. Đây là quyết định của hợp đồng, cần thống nhất với cả bên gửi và bên nhận.

2. Thiết kế ma trận theo hai chiều

Đối với mỗi trường, xét có mặt hay vắng mặt rồi xét kiểu và miền của giá trị. Với ma, ca thiếu và ca số nguyên đều sai. Với ghi_chu, thiếu là đúng, chuỗi rỗng là đúng, null là sai. Nếu chỉ dùng thao tác đọc khóa với mặc định null, bộ kiểm tra có thể vô tình gộp hai trạng thái cần phân biệt.

3. Chạy oracle nhỏ và đối chiếu đặc tả

Mẫu Python dùng phép kiểm tra khóa tồn tại trước khi kiểm tra kiểu. Năm ca kiểm chứng các nhánh của hợp đồng. Để chuyển sang JSON Schema, khai báo ma trong required, xác định type cho từng thuộc tính và thêm minLength cho ma. Mẫu chưa kiểm tra tập khóa bổ sung, vì quy định đó cần được phát biểu riêng.

Chạy ví dụ bằng python test_hop_dong_thieu_va_null.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_hop_dong_thieu_va_null.pyTải mã nguồn
def hop_le(doi_tuong):
    if not isinstance(doi_tuong, dict):
        return False
    if not isinstance(doi_tuong.get("ma"), str) or not doi_tuong["ma"]:
        return False
    if "ghi_chu" not in doi_tuong:
        return True
    return isinstance(doi_tuong["ghi_chu"], str)

cac_ca = [
    ({"ma": "A"}, True),
    ({"ma": "A", "ghi_chu": ""}, True),
    ({"ma": "A", "ghi_chu": None}, False),
    ({"ghi_chu": "Buổi chiều"}, False),
    ({"ma": 7}, False),
]
for du_lieu, ky_vong in cac_ca:
    assert hop_le(du_lieu) is ky_vong
print("Trường tùy chọn có thể vắng, nhưng null không được chấp nhận theo hợp đồng này.")

4. Kiểm tra tác động tới các phiên bản máy khách

Khi máy chủ đổi từ bỏ trường sang gửi null, một máy khách cũ có thể báo lỗi dù thông tin nghiệp vụ gần giống nhau. Hãy lưu phản hồi đại diện của từng phiên bản, chạy cùng bộ giải mã và nêu rõ kết quả kỳ vọng. So sánh hợp đồng ở ranh giới hai thành phần giúp xác định thay đổi cần phối hợp phát hành.

Đọc thêm Tài liệu JSON Schema về thuộc tính và required.