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秒)可能不够用。
修复步骤
- 统一调用端和task端的参数字段名,按需调整task超时时间
测试用例中beforeEach代码修正为:
beforeEach(() => { cy.task("cleanUpDB", { theQuery: "UPDATE SQL GOES HERE" // 和task端解构字段保持一致 }, { timeout: 20000 }) // 根据SQL实际执行耗时调整超时阈值,单位毫秒 })
- 重构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(单位毫秒)
错误参考截图

内容的提问来源于stack exchange,提问作者Ame
相关产品推荐
相关产品推荐

