情况是:
我有一堆相互依赖的 cypress 测试规范(测试项目的规范使得它们不可能独立)。
在第一个规范中,我创建了一个对象数组并将其设为环境变量,以便我可以在其他规范中对该数组进行操作。
在带有 cypress UI 仪表板的 head-full 模式下,它工作得非常顺利,但在无头模式下,一个规范中创建的环境变量的值在下一个规范中是“未定义”的。
所以
spec1.cy.ts const arrafOfObjects = pageObject.functionThatReturnsTheArray(); Cypress.env("arrafOfObjects", arrafOfObjects); spec2.cy.ts const arrafOfObjects = Cypress.env("arrafOfObjects"); const length = arrafOfObjects.length //TypeError: Cannot read properties of undefined (reading 'length') cypress.config.js const { defineConfig } = require("cypress"); const { verifyDownloadTasks } = require('cy-verify-downloads'); const { removeDirectory } = require('cypress-delete-downloads-folder'); const env = 'staging' module.exports = defineConfig({ env:{ godUser: 'some.user@domain.cloud', passwordChargeGodUser: 'secretPassword' securityconfigHash: process.env.secretConfigHash }, e2e: { baseUrl: 'https://url.' + env + '.domain.cloud', excludeSpecPattern : ["cypress/e2e/2-advanced-examples","cypress/e2e/1-getting-started", "cypress/e2e/0-financeportal"], downloadsFolder: "cypress/downloads", testIsolation: false, trashAssetsBeforeRuns : true, experimentalRunAllSpecs : true, chromeWebSecurity: false, experimentalModifyObstructiveThirdPartyCode: true, experimentalOriginDependencies: false, defaultCommandTimeout: 10000, numTestsKeptInMemory : 0, requestTimeout : 30000, responseTimeout : 50000, pageLoadTimeout: 1000000, setupNodeEvents(on, config) { on('task', verifyDownloadTasks); on('task', { removeDirectory }) }, }, });
编辑:我做了一些更多的调查,似乎无头模式忽略testIsolation: false配置并正在清除内存......知道这怎么可能吗?
testIsolation: false
从您提供的信息来看,问题可能出在无头模式下 Cypress 的内存清理机制上。在无头模式下,Cypress 可能会执行额外的内存管理以提高性能和资源利用率,这可能会导致在规范之间共享的环境变量被重置或清除。
一种解决方法是使用 Cypress 的自定义命令来处理环境变量,以确保它们在规范之间保持一致。您可以创建一个自定义命令来设置和获取环境变量,以及在需要时进行清理。以下是一个示例:
// 在 Cypress/support/commands.js 中创建自定义命令 Cypress.Commands.add('setEnvironmentVariable', (name, value) => { Cypress.env[name] = value; }); Cypress.Commands.add('getEnvironmentVariable', (name) => { return Cypress.env[name]; }); Cypress.Commands.add('clearEnvironmentVariable', (name) => { delete Cypress.env[name]; });
然后,在您的测试规范中使用这些自定义命令来设置和获取环境变量,确保它们的一致性:
// spec1.cy.ts cy.setEnvironmentVariable('arrafOfObjects', pageObject.functionThatReturnsTheArray()); // spec2.cy.ts const arrafOfObjects = cy.getEnvironmentVariable('arrafOfObjects'); // 后续操作...
使用这种方法,您可以确保在不同的测试规范之间共享环境变量,并且不受 Cypress 的内存管理机制的影响。