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

