【问题标题】:Unable to validate complete JSON schema using tv4无法使用 tv4 验证完整的 JSON 架构
【发布时间】:2021-09-06 17:46:12
【问题描述】:

这里是新手。

我想知道是否有人可以提供帮助,因为我不知所措!我试图断言来自 GET API 调用的响应符合这个怪物模式集 - 使用 console.log() 看起来每个属性都已成功访问,如果我更改对象类型,测试将失败,因为我期待。

处理模式 - 如果我尝试更改数据数组中的属性,即从字符串更改为布尔值,测试仍将通过,尽管它不符合我定义的所需模式,

非常感谢任何指导!

//Test the schema is valid
const schema = {
    "type": "object",
    "properties": {
        "current_page": {
            "type": "integer"
        },
        "data": {
            "type": "array",
            "properties": {
                "id": {
                    "type": "integer"
                },
                "first_name": {
                    "type": "string"
                },
                "last_name": {
                    "type": "string"
                },
                "telephone": {
                    "type": "string"
                },
                "postcode": {
                    "type": "string"
                },
                "date_of_birth": {
                    "type": "string"
                },
                "profession": {
                    "type": "string"
                },
                "time_served": {
                    "type": "integer"
                },
                "national_insurance_number": {
                    "type": "string"
                },
                "employer": {
                    "type": "string"
                },
                "lco_id": {
                    "type": "integer"
                },
                "company_employed": {
                    "type": "null"
                },
                "company_employed_email": {
                    "type": "null"
                },
                "company_employed_telephone": {
                    "type": "string"
                },
                "company_employed_address": {
                    "type": "null"
                },
                "apprentice": {
                    "type": "boolean"
                },
                "apprentice_trade": {
                    "type": "string"
                },
                "apprentice_course": {
                    "type": "string"
                },
                "apprentice_started_at": {
                    "type": "string"
                },
                "apprentice_ended_at": {
                    "type": "string"
                },
                "work_experience": {
                    "type": "boolean"
                },
                "work_experience_trade": {
                    "type": "null"
                },
                "work_experience_education": {
                    "type": "null"
                },
                "work_experience_started_at": {
                    "type": "null"
                },
                "work_experience_ended_at": {
                    "type": "null"
                },
                "nvq": {
                    "type": "boolean"
                },
                "nvq_trade": {
                    "type": "string"
                },
                "nvq_education": {
                    "type": "string"
                },
                "nvq_started_at": {
                    "type": "string"
                },
                "nvq_ended_at": {
                    "type": "string"
                },
                "unemployed": {
                    "type": "boolean"
                },
                "unemployed_months": {
                    "type": "null"
                },
                "company_employed_postcode": {
                    "type": "string"
                },
                "partner_relationship": {
                    "type": "null"
                },
                "self_partner_relationship": {
                    "type": "null"
                },
                "emergency_contact_first_name": {
                    "type": "string"
                },
                "emergency_contact_last_name": {
                    "type": "string"
                },
                "emergency_contact_telephone": {
                    "type": "string"
                },
                "enrollment_id": {
                    "type": "integer"
                },
                "created_at": {
                    "type": "string"
                },
                "updated_at": {
                    "type": "string"
                },
                "mode_of_travel": {
                    "type": "string"
                },
                "driver_or_passenger": {
                    "type": "string"
                },
                "fuel_type": {
                    "type": "string"
                },
                "engine_capacity": {
                    "type": "string"
                },
                "rtw_declaration": {
                    "type": "boolean"
                },
                "rtw_proof1_upload_id": {
                    "type": "null"
                },
                "rtw_proof2_upload_id": {
                    "type": "null"
                },
                "card_type": {
                    "type": "string"
                },
                "gender": {
                    "type": "string"
                },
                "self_gender": {
                    "type": "null"
                },
                "marital_status": {
                    "type": "string"
                },
                "disability_act": {
                    "type": "string"
                },
                "disability_description": {
                    "type": "null"
                },
                "ethnic_origin": {
                    "type": "string"
                },
                "religion": {
                    "type": "string"
                },
                "nationality": {
                    "type": "string"
                },
                "sexual_orient": {
                    "type": "string"
                },
                "checked_membership": {
                    "type": "integer"
                },
                "training_checked": {
                    "type": "integer"
                },
                "enrollment": {
                    "type": "object",
                    "properties": {
                        "id": {
                            "type": "integer"
                        },
                        "inducted": {
                            "type": "boolean"
                        },
                        "user_id": {
                            "type": "integer"
                        },
                        "created_at": {
                            "type": "string"
                        },
                        "updated_at": {
                            "type": "string"
                        },
                        "expiry_date": {
                            "type": "string"
                        },
                        "user": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "email": {
                                    "type": "string"
                                },
                                "role": {
                                    "type": "integer"
                                },
                                "created_at": {
                                    "type": "string"
                                },
                                "updated_at": {
                                    "type": "string"
                                },
                                "state": {
                                    "type": "integer"
                                },
                                "last_login_at": {
                                    "type": "null"
                                }
                            },
                            "required": [
                                "id",
                                "email",
                                "role",
                                "created_at",
                                "updated_at",
                                "state",
                                "last_login_at"
                            ]
                        }
                    },
                    "required": [
                        "id",
                        "inducted",
                        "user_id",
                        "created_at",
                        "updated_at",
                        "expiry_date",
                        "user"
                    ]
                }
            },
            "required": [
                "id",
                "first_name",
                "last_name",
                "telephone",
                "postcode",
                "date_of_birth",
                "profession",
                "time_served",
                "national_insurance_number",
                "employer",
                "lco_id",
                "company_employed",
                "company_employed_email",
                "company_employed_telephone",
                "company_employed_address",
                "apprentice",
                "apprentice_trade",
                "apprentice_course",
                "apprentice_started_at",
                "apprentice_ended_at",
                "work_experience",
                "work_experience_trade",
                "work_experience_education",
                "work_experience_started_at",
                "work_experience_ended_at",
                "nvq",
                "nvq_trade",
                "nvq_education",
                "nvq_started_at",
                "nvq_ended_at",
                "unemployed",
                "unemployed_months",
                "company_employed_postcode",
                "partner_relationship",
                "self_partner_relationship",
                "emergency_contact_first_name",
                "emergency_contact_last_name",
                "emergency_contact_telephone",
                "enrollment_id",
                "created_at",
                "updated_at",
                "mode_of_travel",
                "driver_or_passenger",
                "fuel_type",
                "engine_capacity",
                "rtw_declaration",
                "rtw_proof1_upload_id",
                "rtw_proof2_upload_id",
                "card_type",
                "gender",
                "self_gender",
                "marital_status",
                "disability_act",
                "disability_description",
                "ethnic_origin",
                "religion",
                "nationality",
                "sexual_orient",
                "checked_membership",
                "training_checked",
                "enrollment",
            ]
        },
    }
}

// Use tiny validator to validate the results - Error if there are additional properties, and check recursion.

pm.test("Validate schema contains the relevant details", () => {
    tv4.validateMultiple(jsonData, schema, true, true);
    var jsonData = JSON.parse(responseBody);

    // Log all errors to the console 
    var validationResult = tv4.validateMultiple(jsonData, schema, true, true);
    for (var i = 0; i < validationResult.errors.length; i++) {
        console.log("path :" + validationResult.errors[i].dataPath + " message :" + validationResult.errors[i].message);
    }

});

【问题讨论】:

  • 如果包含敏感信息,您能否也发布回复或至少发布其结构。邮递员包括 AJV,这在这里可能会更好,所以你只需要在你的测试中使用 pm.response.to.have.jsonSchema(schema) 而不是其余的。
  • 数据数组如何具有属性?它是具有该属性的对象数组吗?

标签: arrays api testing automated-tests postman


【解决方案1】:
const schema = {
    "type": "object",
    "properties": {
        "current_page": {
            "type": "boolean"
        }

    }
}


pm.test("Validate schema contains the relevant details", () => {

    var jsonData = { "current_page": 2 }

    // Log all errors to the console 
    var validationResult = tv4.validateMultiple(jsonData, schema, true, true);
    validationResult.valid ? null : console.log(JSON.stringify(validationResult, null, 2))
    pm.expect(validationResult.valid, JSON.stringify(validationResult, null, 2)).to.be.true


});

你不希望断言它,这就是它总是通过的原因,也正如 Danny 提到的那样使用

const schema = {
    "type": "object",
    "properties": {
        "current_page": {
            "type": "boolean"
        }

    }
}


pm.test("Validate schema contains the relevant details", () => {

var jsonData = { "current_page": 2 }

pm.response.to.have.jsonSchema(schema)

});

对于数组,您应该使用项目而不是属性:

const schema = {
    "type": "object",
    "properties": {
        "data": {
            "type": "array",
            "items": {
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                     "name": {
                        "type": "string"
                    }
                },
                "required":["id","name"]
            }
        }
    }
}
pm.test("Validate schema contains the relevant details", () => {

    var jsonData = { "data": [{ "id": 2,"name":"test" }] }
    // Log all errors to the console 
    var validationResult = tv4.validateMultiple(jsonData, schema, true, true);
    validationResult.valid ? null : console.log(JSON.stringify(validationResult, null, 2))
    pm.expect(validationResult.valid, JSON.stringify(validationResult, null, 2)).to.be.true


});

您可以使用以下方法轻松创建架构:

https://www.jsonschema.net/login

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2012-09-16
    • 1970-01-01
    相关资源
    最近更新 更多