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

Cypress如何仅在当前测试用例中禁用cy.request的请求重试

问题排查与解决方案

首先明确:原生cy.request默认没有内置重试机制,你遇到的重复生成3-5条记录的问题,基本都是请求命令被嵌套在了Cypress的重试链路里导致的,以下是对应排查和仅对当前测试生效的修复方案:


优先排查:请求是否被嵌套在可重试的命令链中

Cypress的重试机制只会作用在带断言的查询命令链上,如果你把cy.request写在了.should()、.assert()这类会触发重试的命令回调里,只要断言首次执行不通过,整个回调内的所有代码都会被重复执行,POST请求自然会被多次触发。
典型错误写法参考:

// 错误:request被包在带重试的断言回调内
cy.get('.table-container').should('exist').then(() => {
  // 这里面的代码如果should触发重试就会重复跑
  cy.request(setHeaders('POST', `${url}`, trafficAnalyticMessage))
})

修复方法

把三段请求逻辑(初始GET -> POST -> 二次GET)全部移到独立的、不嵌套在重试断言内的作用域,比如直接写在测试用例的最外层流程里,不要包在会重试的命令回调中。


如果是全局配置了request重试的场景

如果你项目里通过自定义命令封装、第三方插件给cy.request加了全局重试逻辑,可以在单个测试用例内临时关闭,不影响其他用例:

  • 方案1:直接给单个用例配置重试次数为0
    // 仅对当前it块生效,不会影响其他测试
    it('校验新增记录逻辑', { retries: { runMode: 0, openMode: 0 } }, () => {
      // 初始GET
      cy.request(setHeaders('GET', `${url}?params..`, undefined)).then((firstGetRes) => {
        // 记录初始返回的记录长度
      })
    
      // 新增POST
      cy.request(setHeaders('POST', `${url}`, trafficAnalyticMessage)).then((postRes) => {
        // 校验POST返回2xx状态
      })
    
      // 二次GET校验
      cy.request(setHeaders('GET', `${url}?params..`, undefined)).then((secondGetRes) => {
        // 校验新增记录数为1
      })
    })
    
  • 方案2:如果是自定义重写了cy.request命令加了重试逻辑,可以在当前用例内临时覆盖还原,执行完再恢复:
    it('校验新增记录逻辑', () => {
      // 暂存原有自定义request方法
      const originalRequest = cy.request
    
      // 临时覆盖为原生无重试的request
      Cypress.Commands.overwrite('request', (originalFn, ...args) => originalFn(...args))
    
      // 执行你的请求测试逻辑
    
      // 用例结束后恢复原有全局request配置
      cy.request = originalRequest
    })
    

验证方式

打开Cypress Test Runner的左侧命令日志,查看POST请求的实际发送次数:如果日志里POST出现了3-5次,就确认是重试导致的重复触发,按上面的方法调整后,保证POST只执行一次,结果就会和Postman手动执行完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 12:01:04