Cypress,TypeError:无头模式下环境变量“未定义”超出规范

问题描述 投票:0回答:2

情况是:

我有一堆相互依赖的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
配置并正在清除内存......知道这是怎么可能的吗?

javascript typescript cypress
2个回答
0
投票

Cypress.env
变量在每个规范文件中重置。头模式可能会做一些奇怪的事情或与我预期的不同,但环境变量在新规范文件中未定义是有道理的。我的建议是重新构建您的设置,以便您的规范文件不相互依赖 - 无法保证您的文件将始终按特定顺序运行,并且通常最佳实践是让每个测试都独立尽可能。

使用 Cypress.env 设置的环境变量仅在当前规范文件的范围内。

Cypress 单独运行每个规范文件:浏览器在规范之间退出。在一个规范中添加或更改的环境变量在其他规范中不可见。


0
投票

插件 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)
})
© www.soinside.com 2019 - 2024. All rights reserved.