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

Info about Cypress Component Testing can be found here

Info about using Cypress and Storybook can be found here

Installation

Keep Nx Package Versions In Sync

Make sure to install the @nx/cypress version that matches the version of nx in your repository. If the version numbers get out of sync, you can encounter some difficult to debug errors. You can fix Nx version mismatches with this recipe.

In any Nx workspace, you can install @nx/cypress by running the following command:

โฏ

nx add @nx/cypress

This will install the correct version of @nx/cypress.

How @nx/cypress Infers Tasks

Inferred Tasks

Since Nx 18, Nx plugins can infer tasks for your projects based on the configuration of different tools. You can read more about it at the Inferred Tasks concept page.

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.js
  • cypress.config.ts
  • cypress.config.mjs
  • cypress.config.mts
  • cypress.config.cjs
  • cypress.config.cts

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

The @nx/cypress/plugin is configured in the plugins array in nx.json.

nx.json
1{ 2 "plugins": [ 3 { 4 "plugin": "@nx/cypress/plugin", 5 "options": { 6 "ciTargetName": "e2e-ci", 7 "targetName": "e2e", 8 "componentTestingTargetName": "component-test" 9 } 10 } 11 ] 12} 13
  • The targetName, ciTargetName and componentTestingTargetName options control the namea of the inferred Cypress tasks. The default names are e2e, e2e-ci and component-test.

Splitting E2E tasks by file

The @nx/cypress/plugin will automatically split your e2e tasks by file. You can read more about this 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:

apps/my-project-e2e/cypress.config.ts
1import { defineConfig } from 'cypress'; 2import { nxE2EPreset } from '@nx/cypress/plugins/cypress-preset'; 3 4export default defineConfig({ 5 e2e: { 6 ...nxE2EPreset(__filename, { 7 cypressDir: 'src', 8 bundler: 'vite', 9 webServerCommands: { 10 default: 'nx run my-project:serve', 11 production: 'nx run my-project:preview', 12 }, 13 ciWebServerCommand: 'nx run my-project:serve-static', 14 }), 15 baseUrl: 'http://localhost:4200', 16 }, 17}); 18
Using setupNodeEvents function

If you use the setupNodeEvents function in your Cypress configuration, make sure to invoke the same function that is returned by nxE2EPreset. See the recipe on using setupNodeEvents with Cypress preset for more details.

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 frontend

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-name

Optionally, 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:4200

Replace your-app-name with the app's name as defined in your project.json file or the name property of your package.json.

E2E setup location

The @nx/cypress:configuration generator is not a project generator. It won't generate a separate project for the E2E tests. It will configure Cypress for the provided project.

To set up a separate project, you can generate a separate project with a project generator like @nx/js:library first and then run the @nx/cypress:configuration generator.

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=production

You can use the --spec flag to glob for test files.

โฏ

# run the tests in the smoke/ directory

โฏ

nx e2e frontend-e2e --spec="**smoke/**"

โฏ

# run the tests in smoke/ directory and with dashboard in the file name

โฏ

nx 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)

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-e2e

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"

Required options

If baseUrl is not provided, Cypress will expect to have the baseUrl property in its config file. Otherwise, it will error.

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

If you're needing to pass a variable to Cypress that you wish to not commit to your repository, i.e. API keys, or dynamic values based on configurations, i.e. API URLs. This is where Cypress environment variables can be used.

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 env option in the project configuration or the commandline.

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 want to not 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.

Set the env option 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. You can leverage target configurations to define different values as well.

Optionally, you can pass environment variables via the commandline with the --env flag.

Executor options and --env

Providing the --env flag will override the env option set in the project configuration.

โฏ

nx e2e frontend-e2e --env.API_URL="https://api.my-nx-website.com" --env.API_KEY="abc-123"