Khi làm việc với các API trả về dữ liệu JSON, việc kiểm tra tính hợp lệ của cấu trúc — bao gồm kiểu dữ liệu từng trường, mức độ lồng nhau, và sự hiện diện bắt buộc của các thuộc tính — là bước thiết yếu để đảm bảo chất lượng kiểm thử. Thay vì so sánh giá trị cụ thể (thường thay đổi theo thời gian hoặc ngữ cảnh), ta có thể áp dụng JSON Schema để xác thực mô hình dữ liệu một cách linh hoạt và bền vững.
Ví dụ, phản hồi từ yêu cầu GET https://httpbin.org/get?a=test có dạng:
{
"args": { "a": "test" },
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "PostmanRuntime/7.32.3"
},
"origin": "203.122.45.77",
"url": "https://httpbin.org/get?a=test"
}
Một lược đồ kiểm tra phù hợp sẽ yêu cầu:
- Phản hồi là một đối tượng (
"type": "object") với bốn thuộc tính bắt buộc:args,headers,origin,url. argslà đối tượng chứa duy nhất trườngacó kiểu chuỗi.headerslà đối tượng với các thuộc tính cố định nhưAccept,Host,User-Agent, tất cả đều phải là chuỗi.originvàurlđều là chuỗi.
Lược đồ JSON tương ứng được viết như sau:
{
"type": "object",
"properties": {
"args": {
"type": "object",
"properties": { "a": { "type": "string" } }
},
"headers": {
"type": "object",
"properties": {
"Accept": { "type": "string" },
"Host": { "type": "string" },
"User-Agent": { "type": "string" }
}
},
"origin": { "type": "string" },
"url": { "type": "string" }
},
"required": ["args", "headers", "origin", "url"]
}
Các mẫu phổ biến khác trong JSON Schema:
- Mảng: dùng
"items"thay vì"properties", ví dụ{"type": "array", "items": {"type": "number"}}— mảng số. - Chuỗi:
{"type": "string"}, có thể mở rộng với"minLength","pattern". - Số nguyên:
{"type": "integer"}, hỗ trợ"minimum","maximum".
Trong Postman, thư viện tv4 (Tiny Validator v4) được tích hợp sẵn để thực hiện kiểm tra này. Không cần cài đặt thêm — chỉ cần khai báo lược đồ và gọi hàm tv4.validate() trong tab Tests.
Đoạn mã kiểm thử sau minh họa cách triển khai:
const responseSchema = {
"type": "object",
"properties": {
"args": { "type": "object", "properties": { "a": { "type": "string" } } },
"headers": {
"type": "object",
"properties": {
"Accept": { "type": "string" },
"Host": { "type": "string" },
"User-Agent": { "type": "string" }
}
},
"origin": { "type": "string" },
"url": { "type": "string" }
},
"required": ["args", "headers", "origin", "url"]
};
pm.test("Response matches expected schema", () => {
const payload = pm.response.json();
const isValid = tv4.validate(payload, responseSchema);
pm.expect(isValid).to.be.true;
if (!isValid) {
console.error("Validation errors:", tv4.error);
}
});
Kết quả kiểm tra sẽ hiển thị Pass nếu dữ liệu phản hồi tuân thủ đầy đủ lược đồ đã định nghĩa. Trường hợp thất bại, thông tin lỗi chi tiết có thể được truy xuất qua tv4.error để gỡ rối nhanh chóng.