Cypress is a test runner built for the modern web. It has a lot of great features:
- Time travel
- Real-time reloads
- Automatic waiting
- Spies, stubs, and clocks
- Network traffic control
- Screenshots and videos
Setting Up @nx/cypress
Section titled “Setting Up @nx/cypress”Info about Cypress Component Testing can be found here
Installation
Section titled “Installation”In any Nx workspace, you can install @nx/cypress by running the following command:
nx add @nx/cypressThis will install the correct version of @nx/cypress.
Install the @nx/cypress package with your package manager.
npm add -D @nx/cypressHow @nx/cypress Infers Tasks
Section titled “How @nx/cypress Infers Tasks”The @nx/cypress plugin will create a task for any project that has a Cypress configuration file present. Any of the following files will be recognized as a Cypress configuration file:
cypress.config.jscypress.config.tscypress.config.mjscypress.config.cjs
View Inferred Tasks
Section titled “View Inferred Tasks”To view inferred tasks for a project, open the project details view in Nx Console or run nx show project my-project --web in the command line.
@nx/cypress Configuration
Section titled “@nx/cypress Configuration”The @nx/cypress/plugin is configured in the plugins array in nx.json.
{ "plugins": [ { "plugin": "@nx/cypress/plugin", "options": { "targetName": "e2e", "ciTargetName": "e2e-ci", "componentTestingTargetName": "component-test", "ciComponentTestingTargetName": "component-test-ci", "openTargetName": "open-cypress" } } ]}The options shown above control the names of the inferred Cypress tasks. The following table shows the default values for each option:
| Option | Default |
|---|---|
targetName | "e2e" |
ciTargetName | "e2e-ci" |
componentTestingTargetName | "component-test" |
ciComponentTestingTargetName | undefined (task is not inferred by default) |
openTargetName | "open-cypress" |
Splitting E2E tasks by file
Section titled “Splitting E2E tasks by file”The @nx/cypress/plugin will automatically split your e2e tasks by file. You can read more about the Atomizer feature here.
To enable e2e task splitting, make sure there is a ciWebServerCommand property set in your cypress.config.ts file. It will look something like this:
import { defineConfig } from 'cypress';import { nxE2EPreset } from '@nx/cypress/plugins/cypress-preset';
export default defineConfig({ e2e: { ...nxE2EPreset(__filename, { cypressDir: 'src', bundler: 'vite', webServerCommands: { default: 'nx run my-project:serve', production: 'nx run my-project:preview', }, ciWebServerCommand: 'nx run my-project:serve-static', }), baseUrl: 'http://localhost:4200', },});Splitting Component Testing Tasks by File
Section titled “Splitting Component Testing Tasks by File”The @nx/cypress/plugin can also automatically split your component testing tasks by file. To enable it, set the ciComponentTestingTargetName option of the @nx/cypress/plugin in your nx.json file. It will look something like this:
{ "plugins": [ { "plugin": "@nx/cypress/plugin", "options": { "targetName": "e2e", "ciTargetName": "e2e-ci", "componentTestingTargetName": "component-test", "ciComponentTestingTargetName": "component-test-ci", "openTargetName": "open-cypress" } } ]}E2E Testing
Section titled “E2E Testing”By default, when creating a new frontend application, Nx will use Cypress to create the e2e tests project.
nx g @nx/web:app apps/frontendConfigure Cypress for an existing project
Section titled “Configure Cypress for an existing project”To configure Cypress for an existing project, run the following generator:
nx g @nx/cypress:configuration --project=your-app-nameOptionally, you can use the --baseUrl option if you don't want the Cypress plugin to serve your-app-name.
nx g @nx/cypress:configuration --project=your-app-name --baseUrl=http://localhost:4200Replace your-app-name with the app's name as defined in your project.json file or the name property of your package.json.
Testing Applications
Section titled “Testing Applications”Run nx e2e frontend-e2e to execute e2e tests with Cypress.
You can run your e2e test against a production build by using the production configuration
nx e2e frontend-e2e --configuration=productionYou can use the --spec flag to glob for test files.
# run the tests in the smoke/ directorynx e2e frontend-e2e --spec="**smoke/**"
# run the tests in smoke/ directory and with dashboard in the file namenx e2e frontend-e2e --spec="**smoke/**,**dashboard.cy**"By default, Cypress will run in headless mode. You will have the result of all the tests and errors (if any) in your terminal. Screenshots and videos will be accessible in dist/cypress/apps/frontend/screenshots and dist/cypress/apps/frontend/videos.
Watching for Changes (Headed Mode)
Section titled “Watching for Changes (Headed Mode)”You can also run Cypress in headed mode and watching for changes. This is a great way to enhance the dev workflow. You can build up test files with the application running and Cypress will re-run those tests as you enhance and add to the suite.
nx open-cypress frontend-e2enx e2e frontend-e2e --watchSpecifying a Custom Url to Test
Section titled “Specifying a Custom Url to Test”The baseUrl property provides you the ability to test an application hosted on a specific domain.
nx e2e frontend-e2e --config="baseUrl=https://frontend.com"nx e2e frontend-e2e --baseUrl=https://frontend.comUsing cypress.config.ts
Section titled “Using cypress.config.ts”If you need to fine tune your Cypress setup, you can do so by modifying cypress.config.ts in the project root. For instance, you can easily add your projectId to save all the screenshots and videos into your Cypress dashboard. The complete configuration is documented on the official website.
For adding more dynamic configurations to your Cypress configuration, you can look into using setupNodeEvents configuration option.
Environment Variables
Section titled “Environment Variables”If you need to pass a variable to Cypress that you don't want to commit to your repository (i.e. API keys, dynamic values based on configurations, API URLs), you can use Cypress environment variables.
There are a handful of ways to pass environment variables to Cypress, but the most common is going to be via the cypress.env.json file, the -e Cypress arg or the env option from the @nx/cypress:cypress executor in the project configuration or the command line.
Create a cypress.env.json file in the projects root (i.e. apps/my-cool-app-e2e/cypress.env.json). Cypress will automatically pick up this file. This method is helpful for configurations that you don't want to commit. Just don't forget to add the file to the .gitignore and add documentation so people in your repo know what values to populate in their local copy of the cypress.env.json file.
Setting the -e Cypress arg or the env option from the @nx/cypress:cypress executor in the project configuration is a good way to add values you want to define that you don't mind committing to the repository, such as a base API URL.
{ ... "targets": { "e2e": { "options": { "args": "--env=API_URL=https://api.my-nx-website.com" } } }}{ ... "targets": { "e2e": { "executor": "@nx/cypress:cypress", "options": { "env": "API_URL=https://api.my-nx-website.com" } } }}Finally, you can also pass environment variables via the command line with the -e Cypress arg or the --env option for the @nx/cypress:cypress executor.
nx e2e frontend-e2e -e=API_URL=https://api.my-nx-website.com,API_KEY=abc-123nx e2e frontend-e2e --env.API_URL="https://api.my-nx-website.com" --env.API_KEY="abc-123"