在执行API自动化时,如何验证API的响应是否具有唯一ID?

在执行API自动化时,如何验证API的响应是否具有唯一ID?,api,automation,cypress,unique-id,Api,Automation,Cypress,Unique Id,我正在使用Cypress实现API自动化。我想验证这些响应的“id”是否唯一。 下面是API的响应示例 { "data": [ { "id": 5, "created": "2021-01-04T03:50:03.458+05:30" }, { "id": 7,

我正在使用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数据={
“数据”:[
{
“id”:5,
“已创建”:“2021-01-04T03:50:03.458+05:30”
},
{
“id”:7,
“已创建”:“2021-01-04T03:50:03.469+05:30”
},
{
“id”:8,
“已创建”:“2021-01-04T03:50:03.474+05:30”
}
]
};
const id=data.data.map(e=>e.id);
const setIds=新集合(ids);
expect(ids.length).to.equal(setIds.size);

Set总是只包含唯一的值,因此如果原始数据结构中没有唯一的id,Set对象的元素将更少。

一个想法是在
之前预取
中的所有id,并将它们存储到变量中,然后在
中使用此变量,例如,expect.to.be.oneOf

这样做的一个缺点是,如果返回的数据集很大,那么这可能会导致测试运行的时间过长

下面的代码显示了如何实现这一点

请注意,它以正文中的特定Id为目标(通过执行
res.body[2].Id
ie,它获取数据中的第三项)。如果您想测试整个响应,那么您可以只
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);
    });
  });
});