user9847788
user9847788

Reputation: 2445

How to pass values from command line to cypress spec file?

I have a few different environments in which I am running Cypress tests (i.e. envA, envB, envC)

I run the tests like so:

npm run cypress:open -- --env apiEndpoint=https://app-envA.mySite.com

npm run cypress:open -- --env apiEndpoint=https://app-envB.mySite.com

npm run cypress:open -- --env apiEndpoint=https://app-envC.mySite.com

As you can see, the apiEndpoint varies based on the environment.

In one of my Cypress tests, I am testing a value that changes based on the environment being tested.

For example:

expect(resourceTiming.name).to.eq('https://cdn-envA.net/myPage.html')

As you can see the text envA appears in this assertion.

The issue I'm facing is that if I run this test in envB, it will fail like so:

Expected: expect(resourceTiming.name).to.eq('https://cdn-envB.net/myPage.html')

Actual: expect(resourceTiming.name).to.eq('https://cdn-envA.net/myPage.html')

My question is - how can I update the spec files so that the correct URL is asserted when I run in the different environments?

I am wondering if there's a way to pass a value from the command line to the spec file to tell the spec file which environment I'm in, but I'm not sure if that's possible.

Upvotes: 2

Views: 1513

Answers (2)

K. W. H.
K. W. H.

Reputation: 43

Your best bet, in my opinion, is to utilize environment configs (envA.json, envB.json, etc) Keep all of the property names in the configs identical, and then apply the values based on the environment:

 // envA.json file
 "env": {
   "baseUrl": "yourUrlForEnvA.com"
 }
 // envB.json file
 "env": {
   "baseUrl": "yourUrlForEnvB.com"
 }

That way, you can call Cypress.env('baseUrl') in your test, and no matter what, the right property should be loaded in.

You would call your environment from the command line with the following syntax:

"cypress run --config-file cypress\\config\\envA.json",

This sets up the test run to grab the right config from the start. Calling the url for login, for example, would be something like:

cy.login(Cypress.env('baseUrl'))

Best of luck to you!

Upvotes: 0

Alapan Das
Alapan Das

Reputation: 18634

You can directly use the Cypress.env('apiEndpoint') in your assertions, so that whatever you're passing via CLI, your spec files has the same value -

expect(resourceTiming.name).to.eq(Cypress.env('apiEndpoint'))

And if you want to check that when you pass https://app-envA.mySite.com and the url you expect in the spec file is https://cdn-envA.net/myPage.html, You can use:

expect(resourceTiming.name).to.eq(Cypress.env('apiEndpoint').replace('app', 'cdn').replace('mySite.com', 'net') + '/myPage.html')

Upvotes: 3

Related Questions