小能豆

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

javascript

情况是:

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


阅读 104

收藏
2024-02-28

共1个答案

小能豆

从您提供的信息来看,问题可能出在无头模式下 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 的内存管理机制的影响。

2024-02-28