如何在执行 API 自动化时验证 API 的响应具有唯一 ID?
How can I validate that the response of API has unique IDs while doing API Automation?
我正在使用 Cypress 进行 API 自动化。我想验证这些响应的“id”是否是唯一的。
以下是 API
的示例响应
{
"data":
[
{
"id": 5,
"created": "2021-01-04T03:50:03.458+05:30"
},
{
"id": 7,
"created": "2021-01-04T03:50:03.469+05:30"
},
{
"id": 8,
"created": "2021-01-04T03:50:03.474+05:30"
}
]
}
任何建议或想法将不胜感激。谢谢。
选项比较多,可以使用Set:
const data = {
"data": [
{
"id": 5,
"created": "2021-01-04T03:50:03.458+05:30"
},
{
"id": 7,
"created": "2021-01-04T03:50:03.469+05:30"
},
{
"id": 8,
"created": "2021-01-04T03:50:03.474+05:30"
}
]
};
const ids = data.data.map(e => e.id);
const setIds = new Set(ids);
expect(ids.length).to.equal(setIds.size);
Set 将始终仅包含唯一值,因此如果您在原始数据结构中没有唯一 ID,则 set 对象将包含更少的元素。
一个想法可能是预取 before
中的所有 ID,并将它们存储到一个变量中,然后在 expect.to.be.oneOf
中使用该变量。
这样做的缺点是,如果返回的数据集非常大,那么这可能会导致测试 运行 比应有的时间长。
下面的代码显示了这是如何实现的。
请注意,它以正文中的特定 Id 为目标(通过执行 res.body[2].id
即,它获取数据中的第 3 项)。如果您想测试整个响应,那么您可以再次 map
遍历列表 (actualIdList = res.body.map((result) => result.id);
) 并将其存储到另一个变量,然后针对该变量进行断言(使用 expect(actualIdList).to.include.members(idList);
)。
describe('API Test', () => {
let idList;
before('should get some data', () => {
cy.request({
method: 'GET',
url: myUrl
}).then((res) => {
idList = res.body.map((results) => results.id);
});
});
it('should validate an Id in the response', () => {
cy.request({
method: 'GET',
url: myUrl,
}).then((res) => {
expect(res.body[2].id).to.be.oneOf(idList);
});
});
});
我正在使用 Cypress 进行 API 自动化。我想验证这些响应的“id”是否是唯一的。 以下是 API
的示例响应{
"data":
[
{
"id": 5,
"created": "2021-01-04T03:50:03.458+05:30"
},
{
"id": 7,
"created": "2021-01-04T03:50:03.469+05:30"
},
{
"id": 8,
"created": "2021-01-04T03:50:03.474+05:30"
}
]
}
任何建议或想法将不胜感激。谢谢。
选项比较多,可以使用Set:
const data = {
"data": [
{
"id": 5,
"created": "2021-01-04T03:50:03.458+05:30"
},
{
"id": 7,
"created": "2021-01-04T03:50:03.469+05:30"
},
{
"id": 8,
"created": "2021-01-04T03:50:03.474+05:30"
}
]
};
const ids = data.data.map(e => e.id);
const setIds = new Set(ids);
expect(ids.length).to.equal(setIds.size);
Set 将始终仅包含唯一值,因此如果您在原始数据结构中没有唯一 ID,则 set 对象将包含更少的元素。
一个想法可能是预取 before
中的所有 ID,并将它们存储到一个变量中,然后在 expect.to.be.oneOf
中使用该变量。
这样做的缺点是,如果返回的数据集非常大,那么这可能会导致测试 运行 比应有的时间长。
下面的代码显示了这是如何实现的。
请注意,它以正文中的特定 Id 为目标(通过执行 res.body[2].id
即,它获取数据中的第 3 项)。如果您想测试整个响应,那么您可以再次 map
遍历列表 (actualIdList = res.body.map((result) => result.id);
) 并将其存储到另一个变量,然后针对该变量进行断言(使用 expect(actualIdList).to.include.members(idList);
)。
describe('API Test', () => {
let idList;
before('should get some data', () => {
cy.request({
method: 'GET',
url: myUrl
}).then((res) => {
idList = res.body.map((results) => results.id);
});
});
it('should validate an Id in the response', () => {
cy.request({
method: 'GET',
url: myUrl,
}).then((res) => {
expect(res.body[2].id).to.be.oneOf(idList);
});
});
});