get and set environment variables in your tests.
The Environment Variable guide explains the other ways you can set them outside of your tests.
Scope
Environment variables set using
Cypress.envare only in scope for the current spec file.Cypress runs each spec file in isolation: the browser is exited between specs. Environment variables added or changed in one spec won't be visible in other specs.
Difference between OS-level and Cypress environment variables
In Cypress, "environment variables" are variables that are accessible via
Cypress.env. These are not the same as OS-level environment variables. However, it is possible to set Cypress environment variables from OS-level environment variables.
Cypress.env()
Cypress.env(name)
Cypress.env(name, value)
Cypress.env(object)
name (String)
The name of the environment variable to get or set.
value (String)
The value of the environment variable to set.
object (Object)
Set multiple environment variables with an object literal.
cypress.json by default){
"env": {
"foo": "bar",
"baz": "quux"
}
}
Cypress.env() // => {foo: "bar", baz: "quux"}
cypress.json by default)Boolean
We automatically normalize both the key and the value when passed via the command line. Cypress will automatically convert values into Number or Boolean.
CYPRESS_HOST=laura.dev CYPRESS_IS_CI=true CYPRESS_MY_ID=123 cypress run
Cypress.env('HOST') // => "laura.dev"
Cypress.env('IS_CI') // => true
Cypress.env('MY_ID') // => 123
cypress.json by default) from within your testsScope
Remember, any changes that you make to environment variables using this API will only be in effect for the remainder of the tests in the same spec file.
{
"env": {
"foo": "bar",
"baz": "quux"
}
}
Cypress.env('host', 'http://server.dev.local')
Cypress.env('host') // => http://server.dev.local
cypress.json by default) by passing an object literal.// cypress.json
{
"env": {
"foo": "bar",
"baz": "quux"
}
}
Cypress.env({
host: 'http://server.dev.local',
foo: 'foo',
})
Cypress.env() // => {foo: "foo", baz: "quux", host: "http://server.dev.local"}
Here's an example that uses Cypress.env to access an environment variable that's been dynamically set in a plugin.
Use this approach to grab the value of an environment variable once before any of the tests in your spec run.
// cypress/plugins/index.js
module.exports = (on, config) => {
config.env.sharedSecret =
process.env.NODE_ENV === 'qa' ? 'hoop brick tort' : 'sushi cup lemon'
return config
}
// cypress/integration/secrets_spec.js
describe('Environment variable set in plugin', () => {
let sharedSecret
before(() => {
sharedSecret = Cypress.env('sharedSecret')
})
it.only('can be accessed within test.', () => {
cy.log(sharedSecret)
})
})
The Environment Variables guide explains common use cases.
Yes. You can do that and much more.
The Environment Variables guide explains the other ways you can set environment variables for your tests.
Cypress.env and not cy.env?As a rule of thumb anything you call from Cypress affects global state. Anything you call from cy affects local state.
Since the environment variables added or changed by Cypress.env are only in scope for the current spec file, you'd think that it should be cy.env and not Cypress.env… and you'd be right. The fact that Cypress.env affects local state is an artifact of the API evolving over time: Cypress.env used to affect global state—environment variables added in one test spec file were available in other specs—but the Cypress team wisely made each spec run in isolation in 3.0.0 and by that time Cypress.env was public API.
© 2017 Cypress.io
Licensed under the MIT License.
https://docs.cypress.io/api/cypress-api/env