情况是:
我有一堆相互依赖的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: '[email protected]',
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
配置并正在清除内存......知道这是怎么可能的吗?
Cypress.env
变量在每个规范文件中重置。头模式可能会做一些奇怪的事情或与我预期的不同,但环境变量在新规范文件中未定义是有道理的。我的建议是重新构建您的设置,以便您的规范文件不相互依赖 - 无法保证您的文件将始终按特定顺序运行,并且通常最佳实践是让每个测试都独立尽可能。
使用 Cypress.env 设置的环境变量仅在当前规范文件的范围内。
Cypress 单独运行每个规范文件:浏览器在规范之间退出。在一个规范中添加或更改的环境变量在其他规范中不可见。
插件 cypress-data-session 有一个选项 shareAcrossSpecs 似乎适合您的场景。
这是一个示例,因为您有 pageObjects,所以我添加了一个函数属性(以防序列化破坏函数)
spec1.cy.js
before(() => {
const arrayOfObjects = [{'a':1},{'b':2},{'c': () => 3}]
cy.dataSession({
name: 'common', // data name
setup: () => arrayOfObjects, // data creation commands
shareAcrossSpecs: true,
})
})
it('setting data session', () => {
expect(Cypress.getDataSession('common')[0].a).to.equal(1)
expect(Cypress.getDataSession('common')[2].c()).to.equal(3)
})
spec2.cy.js
it('using data session in another spec', () => {
expect(Cypress.getDataSession('common')[0].a).to.equal(1)
expect(Cypress.getDataSession('common')[2].c()).to.equal(3)
})