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

Cypress对接MSSQL执行数据库清理任务超时问题求助

Cypress 测试前数据库清理任务超时修复方案

问题根因

当前代码存在5个明确会触发超时的问题:

  • 参数字段名不匹配:测试用例调用cy.task时传入的查询语句字段为sql,但task处理函数中解构的字段为theQuery,实际执行时数据库查询拿不到有效SQL语句,直接进入异常分支。
  • Promise状态未闭环:catch逻辑块只有注释,既没有返回成功结果也没有抛出错误,Promise会持续处于pending状态,直到触发超时阈值。
  • 存在Promise反模式:sql.connect、sql.query本身已经返回Promise,额外手动包装new Promise很容易出现状态丢失、逻辑不闭环的问题。
  • 数据库连接未释放:每次执行task新建数据库连接后没有主动关闭,连接池占满后后续请求会阻塞排队。
  • 超时阈值可能不足:如果清理SQL本身执行耗时较长,Cypress默认的task超时(旧版本默认10秒,新版本默认60秒)可能不够用。

修复步骤

  1. 统一调用端和task端的参数字段名,按需调整task超时时间
    测试用例中beforeEach代码修正为:
beforeEach(() => {
  cy.task("cleanUpDB", {
    theQuery: "UPDATE SQL GOES HERE" // 和task端解构字段保持一致
  }, { timeout: 20000 }) // 根据SQL实际执行耗时调整超时阈值,单位毫秒
})
  1. 重构task处理逻辑,去掉多余Promise包装,补全异常处理和连接释放逻辑
    cypress配置文件中task注册代码修正为:
on("task", {
  async cleanUpDB({ theQuery }) {
    let dbConnection;
    try {
      dbConnection = await sql.connect(DBConfig)
      const result = await sql.query(theQuery);
      console.log("数据库清理执行结果:", result)
      return result
    } catch (err) {
      console.error("数据库清理执行失败:", err)
      throw err // 异常时直接抛出,避免Promise挂起
    } finally {
      // 无论执行成功失败都释放数据库连接
      await dbConnection?.close()
    }
  }
})

额外排查点

  • 先在数据库客户端单独执行你的清理SQL,确认不存在锁表、慢查询问题
  • 校验DBConfig中的数据库地址、账号、端口配置,确认Cypress运行环境可以正常访问数据库,没有网络策略拦截
  • 如需全局调整所有task的默认超时,可以在cypress配置项中添加taskTimeout: 30000(单位毫秒)

错误参考截图

Cypress任务超时错误截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:33:12