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

如何将Map对象存入Cypress运行返回的JSON结果中

问题根因

Cypress运行时存在两个完全隔离的上下文:测试用例代码运行在浏览器侧的前端上下文,调用cypress.run的主runner逻辑运行在Node.js侧的服务端上下文,二者内存空间不互通,因此直接在浏览器侧写入的全局Map变量,无法在Node侧的runner文件中直接读取。

可行实现方案

通过Cypress官方提供的cy.task跨上下文通信机制,结合运行结束钩子即可实现需求,具体步骤如下:

步骤1:在Node侧配置文件中定义数据存储、读写任务和结果合并逻辑

修改cypress.config.js配置,在Node侧存储自定义Map,同时提供供浏览器侧调用的读写任务,最后通过after:run钩子将自定义数据合并到最终运行结果中:

const { defineConfig } = require('cypress')

// Node侧存储自定义运行时数据,仅在Node上下文生效
const customRuntimeMap = new Map()

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      // 定义读写任务,供浏览器侧的测试用例调用
      on('task', {
        // 写入数据到Node侧Map
        setCustomMapData({ key, value }) {
          customRuntimeMap.set(key, value)
          return null
        },
        // 可选:提供读取接口供测试用例侧调用
        getCustomMapData(key) {
          return customRuntimeMap.get(key) ?? null
        }
      })

      // 测试运行完成钩子,将自定义Map合并到cypress.run返回的结果中
      on('after:run', (results) => {
        // Map转为普通对象方便后续序列化处理
        results.customRuntimeData = Object.fromEntries(customRuntimeMap.entries())
        return results
      })
    }
  }
})

步骤2:在spec测试用例中调用task写入数据

在浏览器侧运行的测试用例中,通过调用提前定义的task写入数据,代替直接操作全局Map:

describe('测试用例集合', () => {
  it('示例测试用例1', () => {
    // 原有测试逻辑
    cy.visit('/')
    // 写入自定义数据到Node侧Map
    const runtimeData = { status: 'pass', spendTime: 1200, timestamp: Date.now() }
    cy.task('setCustomMapData', { key: 'case1', value: runtimeData })
  })

  it('示例测试用例2', () => {
    // 原有测试逻辑
    cy.request('/api/test').its('status').should('eq', 200)
    // 写入自定义数据
    const runtimeData = { status: 'pass', responseTime: 300 }
    cy.task('setCustomMapData', { key: 'case2', value: runtimeData })
  })
})

步骤3:在主runner文件中读取合并后的自定义数据

调用cypress.run获取结果时,可直接读取到上一步合并的自定义运行时数据:

const cypress = require('cypress')

cypress.run({
  spec: './cypress/e2e/**/*.cy.js'
  // 其他运行配置
}).then((runResults) => {
  // 读取自定义运行时数据
  console.log('自定义运行数据:', runResults.customRuntimeData)
  // 原有测试状态数据可正常读取
  console.log('总测试用例数:', runResults.totalTests)
}).catch((err) => {
  console.error('运行异常:', err)
})
注意事项
  • cy.task是异步接口,如果后续测试逻辑依赖数据写入完成,可在其后拼接.then()回调处理后续步骤
  • 存储到Map的数据必须是可JSON序列化的类型,不支持传递函数、Symbol等不可序列化值
  • 多spec并行运行场景下,需要给key添加当前spec的路径前缀避免冲突,防止不同spec的key互相覆盖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:06:04