如何在执行 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);
    });
  });
});