Cypress 环境变量
在Cypress中,"环境变量"指的是通过Cypress.env
访问的变量。这些变量与操作系统级环境变量不同。不过,
可以通过操作系统级环境变量来设置Cypress环境变量。
环境变量在以下场景中非常有用:
- 不同开发者机器上的值不同
- 多个环境中的值不同:(开发、预发布、测试、生产)
- 值经常变化且高度动态
环境变量可以轻松修改——特别是在CI环境中运行时。
与其在测试中硬编码:
cy.request('https://api.acme.corp') // 在其他环境中会失效
不如将其移至Cypress环境变量中:
cy.request(Cypress.env('EXTERNAL_API')) // 指向动态环境变量
环境变量非常适合指向外部服务和服务器,或存 储密码等凭证。
但是,你不需要使用环境变量来指向被测的源和域名。应该使用baseUrl
而非环境变量。
cy.visit()
和cy.request()
会自动添加此前缀值——无需额外指定。
baseUrl
可以在Cypress配置文件中设置——然后你可以通过操作系统环境变量来覆盖它,如下所示。
CYPRESS_BASE_URL=https://staging.app.com cypress run
设置方法
有多种设置环境变量的方式,每种方式适用于不同场景。
总结如下:
不必只选择一种方法。通常会在本地开发时使用一种策略,而在CI运行时使用另一种。
测试运行时,可以使用Cypress.env
函数访问环境变量的值。
方法一:配置文件
在Cypress配置的env
键下设置的任何键/值都会成为环境变量。
- cypress.config.js 文件
- cypress.config.ts 文件
const { defineConfig } = require('cypress')
module.exports = defineConfig({
projectId: '128076ed-9868-4e98-9cef-98dd8b705d75',
env: {
login_url: '/login',
products_url: '/products',
},
})
import { defineConfig } from 'cypress'
export default 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'
概述
- 适合需要提交到源代码控制并在所有机器上保持相同的值
- 仅适用于所有机器上应保持相同的值
方法二: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/'
概述
- 专用于环境变量的文件
- 可以从其他构建过程生成此文件
- 每台机器上的值可以不同(如果不提交到源代码控制)
- 支持嵌套字段(对象),例如
{ testUser: { name: '...', email: '...' } }
- 需要处理另一个文件
- 对于1或2个环境变量来说过于复杂
方法三:CYPRESS_*
在命令行或CI提供程序中设置的任何以CYPRESS_
或cypress_
开头的导出环境变量都会自动被Cypress解析。
环境变量CYPRESS_INTERNAL_ENV
是保留的,不应设置。
覆盖配置选项
匹配相应配置选项的环境变量会覆盖Cypress配置中设置的任何值。
Cypress会自动规范化键和值。移除前导的CYPRESS_
或cypress_
,并将剩余名称转换为驼峰式,同时尽可能将值转换为Number
或Boolean
。
例如,命令行中的这些环境变量会覆盖Cypress配置中设置的任何viewportWidth
或viewportHeight
选项:
export CYPRESS_VIEWPORT_WIDTH=800
export CYPRESS_VIEWPORT_HEIGHT=600
覆盖环境变量
不匹配配置选项的环境变量会设置为测试中使用的环境变量,通 过Cypress.env()
访问,并会覆盖Cypress配置env
对象和cypress.env.json
文件中的任何现有值。
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/'
概述
- 快速导出一些值
- 可以存储在
bash_profile
中 - 允许不同机器之间的动态值
- 特别适合CI环境
- 与其他选项相比,值的来源不太明显
- 不支持嵌套字段
方法四:--env
在使用CLI工具时,可以将环境变量作为选项传递。
这里的值会覆盖所有其他冲突的环境变量。
你可以对cypress run使用--env
参数。
多个值必须用逗号分隔,而不是空格。在某些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/'
概述
- 不需要对文件或配置进行任何更改
- 环境变量的来源更清晰
- 允许不同机器之间的动态值
- 覆盖所有其他设置环境变量的方式
- 在使用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?')
})
}
)
// 为单个测试套件更改环境变量
describe(
'test against Spanish content',
{
env: {
language: 'es',
},
},
() => {
it('displays Spanish', () => {
cy.mount(<International lang={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)
}
)
概述
- 仅在测试套件或测试期间有效
- 环境变量的来源更清晰
- 允许测试之间的动态值
覆盖配置
如果你的环境变量匹配标准配置键,那么它们不会设置环境变量
,而是会覆盖配置值。
更改baseUrl
配置值/不在Cypress.env()
中设置环境变量
export CYPRESS_BASE_URL=http://localhost:8080
'foo'不匹配配置/在Cypress.env()
中设置环境变量
export CYPRESS_FOO=bar