Skip to main content
Cypress应用

Cypress 环境变量

caution
操作系统级环境变量与Cypress环境变量的区别

在Cypress中,"环境变量"指的是通过Cypress.env访问的变量。这些变量与操作系统级环境变量不同。不过, 可以通过操作系统级环境变量来设置Cypress环境变量

环境变量在以下场景中非常有用:

  • 不同开发者机器上的值不同
  • 多个环境中的值不同:(开发、预发布、测试、生产)
  • 值经常变化且高度动态

环境变量可以轻松修改——特别是在CI环境中运行时。

与其在测试中硬编码:

cy.request('https://api.acme.corp') // 在其他环境中会失效

不如将其移至Cypress环境变量中:

cy.request(Cypress.env('EXTERNAL_API')) // 指向动态环境变量
info
使用'baseUrl'

环境变量非常适合指向外部服务和服务器,或存储密码等凭证。

但是,你不需要使用环境变量来指向被测的源和域名。应该使用baseUrl而非环境变量。

cy.visit()cy.request()会自动添加此前缀值——无需额外指定。

baseUrl可以在Cypress配置文件中设置——然后你可以通过操作系统环境变量来覆盖它,如下所示。

CYPRESS_BASE_URL=https://staging.app.com cypress run

设置方法

有多种设置环境变量的方式,每种方式适用于不同场景。

总结如下:

不必只选择一种方法。通常会在本地开发时使用一种策略,而在CI运行时使用另一种。

测试运行时,可以使用Cypress.env函数访问环境变量的值。

方法一:配置文件

Cypress配置env键下设置的任何键/值都会成为环境变量。

const { defineConfig } = require('cypress')

module.exports = defineConfig({
projectId: '128076ed-9868-4e98-9cef-98dd8b705d75',
env: {
login_url: '/login',
products_url: '/products',
},
})

测试文件

Cypress.env() // {login_url: '/login', products_url: '/products'}
Cypress.env('login_url') // '/login'
Cypress.env('products_url') // '/products'

概述

tip
优点
  • 适合需要提交到源代码控制并在所有机器上保持相同的值
danger
缺点
  • 仅适用于所有机器上应保持相同的值

方法二:cypress.env.json

你可以创建自己的cypress.env.json文件,Cypress会自动检查该文件。其中的值会覆盖Cypress配置中冲突的环境变量。

此策略很有用,因为如果将cypress.env.json添加到.gitignore文件中,每个开发者机器上的值可以不同。

{
"host": "veronica.dev.local",
"api_server": "http://localhost:8888/api/v1/"
}

测试文件

Cypress.env() // {host: 'veronica.dev.local', api_server: 'http://localhost:8888/api/v1'}
Cypress.env('host') // 'veronica.dev.local'
Cypress.env('api_server') // 'http://localhost:8888/api/v1/'

概述

tip
优点
  • 专用于环境变量的文件
  • 可以从其他构建过程生成此文件
  • 每台机器上的值可以不同(如果不提交到源代码控制)
  • 支持嵌套字段(对象),例如{ testUser: { name: '...', email: '...' } }
danger
缺点
  • 需要处理另一个文件
  • 对于1或2个环境变量来说过于复杂

方法三:CYPRESS_*

在命令行或CI提供程序中设置的任何以CYPRESS_cypress_开头的导出环境变量都会自动被Cypress解析。

danger

环境变量CYPRESS_INTERNAL_ENV是保留的,不应设置。

覆盖配置选项

匹配相应配置选项的环境变量会覆盖Cypress配置中设置的任何值。

info

Cypress会自动规范化键和值。移除前导的CYPRESS_cypress_,并将剩余名称转换为驼峰式,同时尽可能将值转换为NumberBoolean

例如,命令行中的这些环境变量会覆盖Cypress配置中设置的任何viewportWidthviewportHeight选项:

export CYPRESS_VIEWPORT_WIDTH=800
export CYPRESS_VIEWPORT_HEIGHT=600

覆盖环境变量

不匹配配置选项的环境变量会设置为测试中使用的环境变量,通过Cypress.env()访问,并会覆盖Cypress配置env对象和cypress.env.json文件中的任何现有值。

info

Cypress会自动移除以这种方式指定的任何环境变量名称的前导CYPRESS_cypress_

例如,命令行中的这些环境变量:

export CYPRESS_HOST=laura.dev.local
export cypress_api_server=http://localhost:8888/api/v1/

在测试文件中会得到这些结果:

Cypress.env() // {HOST: 'laura.dev.local', api_server: 'http://localhost:8888/api/v1'}
Cypress.env('HOST') // 'laura.dev.local'
Cypress.env('api_server') // 'http://localhost:8888/api/v1/'

概述

tip
优点
  • 快速导出一些值
  • 可以存储在bash_profile
  • 允许不同机器之间的动态值
  • 特别适合CI环境
danger
缺点
  • 与其他选项相比,值的来源不太明显
  • 不支持嵌套字段

方法四:--env

在使用CLI工具时,可以将环境变量作为选项传递。

这里的值会覆盖所有其他冲突的环境变量。

你可以对cypress run使用--env参数。

caution

多个值必须用逗号分隔,而不是空格。在某些shell中,如Windows PowerShell,可能需要用引号包围键/值对:--env "cyuser=dummyUser,cypassword=dummyPassword"

命令行或CI

cypress run --env host=kevin.dev.local,api_server=http://localhost:8888/api/v1

测试文件

Cypress.env() // {host: 'kevin.dev.local', api_server: 'http://localhost:8888/api/v1'}
Cypress.env('host') // 'kevin.dev.local'
Cypress.env('api_server') // 'http://localhost:8888/api/v1/'

概述

tip
优点
  • 不需要对文件或配置进行任何更改
  • 环境变量的来源更清晰
  • 允许不同机器之间的动态值
  • 覆盖所有其他设置环境变量的方式
danger
缺点
  • 在使用Cypress的任何地方都需要编写--env选项,比较麻烦
  • 不支持嵌套字段

方法五:测试配置

你可以通过将env值传递给测试配置,为特定测试套件或测试设置环境变量。

测试套件配置

// 为单个测试套件更改环境变量
describe(
'test against Spanish content',
{
env: {
language: 'es',
},
},
() => {
it('displays Spanish', () => {
cy.visit(`https://docs.cypress.io/${Cypress.env('language')}/`)
cy.contains('¿Por qué Cypress?')
})
}
)

单个测试配置

// 为单个测试更改环境变量
it(
'smoke test develop api',
{
env: {
api: 'https://dev.myapi.com',
},
},
() => {
cy.request(Cypress.env('api')).its('status').should('eq', 200)
}
)

// 为单个测试更改环境变量
it(
'smoke test staging api',
{
env: {
api: 'https://staging.myapi.com',
},
},
() => {
cy.request(Cypress.env('api')).its('status').should('eq', 200)
}
)

概述

tip
优点
  • 仅在测试套件或测试期间有效
  • 环境变量的来源更清晰
  • 允许测试之间的动态值

覆盖配置

如果你的环境变量匹配标准配置键,那么它们不会设置环境变量,而是会覆盖配置值。

更改baseUrl配置值/不在Cypress.env()中设置环境变量

export CYPRESS_BASE_URL=http://localhost:8080

'foo'不匹配配置/在Cypress.env()中设置环境变量

export CYPRESS_FOO=bar

你可以在此处阅读有关环境变量如何更改配置的更多信息

另请参阅