You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Cypress测试中验证存根请求的轮询频率?

问题:如何用Cypress验证轮询请求的频率?

我有一个使用cy.intercept实现存根响应的Cypress测试,当前拦截的请求正在对后端接口进行轮询——每秒发起一次请求,直到响应中的status属性发生变化。

作为Cypress新手,我可能对可测试内容存在误解,但我想要验证该接口的请求频率,即断言轮询速率正确(每秒一次)。请问是否可以通过Cypress实现这一点?还是需要使用其他工具?

以下是简化后的网络请求存根代码:

cy.intercept(
  {
    method: 'GET',
    path: '/api/user',
  },
  {
    body: {
      id: '1',
      status: 'UPDATED', // 这个状态会终止轮询
      // 其他字段
    },
  }
).as('getUserUpdated');

cy.intercept(
  {
    method: 'GET',
    path: '/api/user',
    times: 2,
  },
  {
    body: {
      id: '1',
      status: 'CREATED',
      // 其他字段
    },
  }
).as('getUserCreated');
解决方案:用Cypress实现轮询频率验证

完全可以用Cypress实现,不需要额外工具。核心思路是记录每次请求的时间戳,然后计算相邻请求的时间差来断言频率是否符合预期,具体步骤如下:

1. 修改存根逻辑,记录请求时间戳

将cy.intercept的静态响应改为回调函数,在每次请求被拦截时记录当前时间:

// 存储所有请求的时间戳
const requestTimestamps = [];

// 拦截前2次请求,返回CREATED并记录时间
cy.intercept(
  {
    method: 'GET',
    path: '/api/user',
    times: 2,
  },
  (req) => {
    requestTimestamps.push(Date.now());
    req.reply({
      body: {
        id: '1',
        status: 'CREATED',
      },
    });
  }
).as('getUserCreated');

// 拦截后续请求,返回UPDATED并记录最后一次时间
cy.intercept(
  {
    method: 'GET',
    path: '/api/user',
  },
  (req) => {
    requestTimestamps.push(Date.now());
    req.reply({
      body: {
        id: '1',
        status: 'UPDATED',
      },
    });
  }
).as('getUserUpdated');

2. 触发轮询并等待终止

执行触发轮询的操作(比如页面加载、按钮点击等),然后等待轮询终止:

// 触发轮询动作(根据实际场景调整,比如访问页面)
cy.visit('/your-page');

// 等待轮询终止(即收到UPDATED响应)
cy.wait('@getUserUpdated');

3. 断言轮询频率

收集完所有时间戳后,计算相邻请求的时间差,断言差值在合理范围内(考虑浏览器定时器误差,允许±200ms的波动):

// 确保至少捕获到3次请求(2次CREATED + 1次UPDATED)
cy.wrap(requestTimestamps).should('have.length.gte', 3);

// 遍历时间戳,验证每次间隔接近1秒
cy.wrap(requestTimestamps).then(timestamps => {
  for (let i = 1; i < timestamps.length; i++) {
    const interval = timestamps[i] - timestamps[i - 1];
    expect(interval).to.be.within(800, 1200);
  }
});

关键说明

  • 使用回调函数替代静态响应,才能在每次请求时注入时间戳记录逻辑。
  • 设置合理的时间误差范围:浏览器的setInterval并非绝对精准,严格断言等于1000ms会导致测试不稳定,±200ms的范围是比较稳妥的选择。
  • 必须等待轮询完全终止后再执行断言,确保所有请求的时间戳都已被收集。

内容的提问来源于stack exchange,提问作者Ellen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:55:26