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

Cypress用async await Promise调用API时测试用例状态码不稳定如何解决

根因说明

同一测试用例多次执行返回不同状态码,和当前实现的等待逻辑直接相关,具体原因如下:

  • 等待逻辑位置错误:你代码中的cy.wait(2000)写在cy.request的响应回调函数内部,是请求已经拿到返回结果后才执行等待,既不会影响本次请求的执行,也无法解决两次用例执行之间的后端数据状态同步问题。
  • 业务状态流转冲突:你调用的是固定车辆ID的购买接口,当某次请求执行成功返回2xx后,该车辆的业务状态会变为已购买,后续再对同一个ID发起购买请求时,业务逻辑会直接拒绝,返回4xx类状态码(常见为400参数错误、409资源状态冲突)。
  • 高频请求触发后端异常:多次请求间隔过短的情况下,同一资源ID的并发写请求会触发数据库乐观锁冲突、或者网关限流规则,最终返回5xx类错误。
解决方案
  • 修正等待逻辑:如果需要等待上一次业务操作的数据完全落盘,将等待逻辑放在cy.request执行前,或在beforeEach全局前置钩子中设置用例执行间隔,示例如下:
// 每次用例执行前等待3秒,确保上一次操作状态同步完成
beforeEach(() => {
  cy.wait(3000)
})
  • 每次执行前重置测试数据:不要复用固定的vehicleIdBuyNow,每次用例执行前调用数据构造接口生成全新的、待购买状态的车辆ID,避免业务状态冲突导致的4xx错误。
  • 新增请求重试逻辑:针对偶发的5xx限流/锁冲突错误,封装带重试的请求方法,非2xx状态下自动重试2-3次,每次间隔1秒,示例如下:
function requestWithRetry(options, retryCount = 3) {
  return cy.request(options).then(res => {
    if (res.status !== 200 && retryCount > 0) {
      cy.wait(1000)
      return requestWithRetry(options, retryCount - 1)
    }
    return res
  })
}

// 调用时替换原有cy.request即可
requestWithRetry({
  method: "POST",
  url: "xxxxxx",
  headers: {
    Authorization: "tttttt",
    "content-type": "application/json",
  },
  body: {
    id: vehicleIdBuyNow,
    bid: minPrice,
    auctionPlatformId: platformIdBuyNow,
    auctionPlatformUserId: platformUserIdBuyNow,
  },
  failOnStatusCode: false,
}).then((res) => {
  // 原有断言逻辑
})
  • 移除无效断言:代码中的expect(true).to.be.true、expect(false).to.be.false无业务校验意义,直接删除即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:27:01