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
相关产品推荐
相关产品推荐

