我目前正在为另一个团队正在研究的API进行端到端测试,我想知道是否有人知道我可以用来测试是否在其中返回了额外字段的JS库。 HTTP响应正文?此功能的目的是在开发人员小组通过测试对api进行更改时,使质量检查小组了解情况,而无需开发人员手动让我们知道他们已经创建了更新。我知道这可以手动实现,但是如果已经有了轮子,我宁愿避免重新创建它。
示例场景:
API调用:GET用户 -返回:用户名,用户ID和用户生日。
使用建议的功能,如果开发团队对“获取”用户调用进行了更新,则返回以下内容 -return:用户名,用户ID,用户生日和用户地址。
测试无法让我知道返回了一个意外字段(用户地址)。
答案 0 :(得分:1)
您需要进行模式验证,那里有像ajv这样的库。
var ajv = new Ajv({ allErrors: true }); // options can be passed, e.g. {allErrors: true}
// API call: GET user - returns : user name, user ID and user birthday.
// With proposed functionality, if the dev team made updates to the Get user call, and it returns the following - return : user name, user ID, user birthday AND user address.
var schema = {
type: "object",
properties: {
userName: {
type: "string",
},
userId: {
type: "string",
},
userBirthdate: {
type: "string",
},
},
required: ["userName", "userId", "userBirthdate"],
additionalProperties: false,
};
var validate = ajv.compile(schema);
var validUser = {
userName: "John",
userId: "john",
userBirthdate: "01012000",
};
var invalidUser = {
userName: "John",
userId: "john",
userBirthdate: "01012000",
userAddress: "World",
};
var valid = validate(validUser);
console.log(`Valid user is valid: ${valid}`);
valid = validate(invalidUser);
console.log(`Invalid user is valid: ${valid}`);
console.log('Validate errors:', validate.errors);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ajv/6.6.2/ajv.min.js"></script>
答案 1 :(得分:1)
模式验证似乎是您想要的。除了另一个答案中提到的库之外,您可能还需要检查类似的库:joi
List<string> validationProperties = new List<string> { "Years"};
bool isValid = true;
foreach (PropertyInfo propertyInfo in model.GetType().GetProperties())
{
if (validationProperties .Contains(propertyInfo.Name))
isValid = ModelState.IsValidField(propertyInfo.Name) && isValid;
}
if (isValid)
{
// do stuff here
}
在规范中,可以使用您选择的断言库对const Joi = require('joi');
const schema = Joi.object().keys({
userName: Joi.string().alphanum().required(),
userId: Joi.number().required(),
userBirthDay: Joi.number().required(),
})
const result = Joi.validate({
userName: 'johndoe',
userId: 1234567,
userBirthDay: 1970,
userAddress: 'John Doe St.'
}, schema);
if (result.error) {
console.log(result.error.details);
}
对象中error
键的存在进行断言。
上面的示例假设您使用nodejs作为运行测试的环境,但是joi的浏览器版本也存在:joi-browser