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

Cypress 9.5.4旧配置下如何在所有spec执行前运行指定代码/函数

Cypress 9.5.4 旧版配置实现所有spec执行前全局前置逻辑

针对你使用Cypress 9.5.4、采用旧版配置文件的场景,没有直接命名为onPrepare的钩子,但可以通过以下两种方案实现对应能力,根据你的逻辑运行环境选择即可:

方案1:Node环境全局前置(最接近onPrepare效果,全量spec仅执行1次)

如果你要跑的逻辑不需要操作浏览器/DOM,比如初始化测试环境、启动依赖服务、清理全局脏数据、生成全局测试凭证这类操作,直接用插件层的before:run事件即可,这是Cypress里最接近传统测试框架onPrepare能力的钩子:

  • 打开旧版配置默认的插件入口文件 cypress/plugins/index.js
  • 在导出的函数中注册before:run事件回调,你的前置逻辑直接写在回调里就行,异步逻辑可以直接用async/await,Cypress会等逻辑执行完成后才开始加载执行spec文件:
/// <reference types="cypress" />
module.exports = (on, config) => {
  on('before:run', async () => {
    // 这里写你的全局前置代码
    console.log('全量测试启动前的全局初始化开始')
    // 示例:await startTestServer() / await cleanGlobalTestData()
  })

  return config
}

注意:这个钩子运行在Node.js上下文,无法访问浏览器DOM、不能调用cy.xxx系列的Cypress浏览器命令。cypress run模式下整个测试流程仅触发1次;cypress open模式下每次触发全量spec运行时会触发1次。

方案2:浏览器环境全局前置

如果你的前置逻辑必须在浏览器里执行,比如注入全局mock、登录获取存在浏览器存储里的会话信息,注意Cypress每个spec运行时都会重置浏览器上下文,浏览器层没有天然跨所有spec仅执行1次的钩子,可以通过support文件+执行标记实现:

  • 打开旧版配置默认的支持文件入口 cypress/support/index.js(这个文件会在所有spec加载前自动引入,不需要你在每个spec里手动import)
  • 写入根级before钩子,加执行标记避免同一次运行中重复执行:
let isGlobalInitFinished = false

before(() => {
  if (isGlobalInitFinished) return
  // 这里写需要浏览器环境执行的全局前置逻辑
  cy.log('浏览器端全局初始化执行')
  // 示例:cy.loginByApi() / cy.interceptGlobalMock()

  isGlobalInitFinished = true
})

注意:如果是cypress open模式下手动选择单个spec运行,每个独立spec的浏览器上下文是隔离的,上面的标记会重置,逻辑会在每个spec首次运行时触发一次;如果需要跨spec也仅执行1次,可以把执行标记存在插件层的全局变量里,通过cy.task做状态判断即可。

避坑提示

  • 不要把全局前置逻辑写在单个spec的before/beforeEach钩子里,这类钩子仅对当前spec文件生效
  • 如果全局逻辑是登录操作,建议搭配cy.session缓存会话,减少重复登录的时间开销

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:42:43