Author: Waris Jamal

End-to-End testing with Cypress: All You Need to Know

Quality assurance plays an important role in ensuring quality standards are met in production applications to help reduce unexpected UX defects for end users. Therefore, it is important to ensure that QA testing becomes an integral part of every application release process.

Researching for the perfect test automation tool or library may become a very tedious task, especially with all the available open-source options in the market. You will need to make a trade-off and pick whichever works best for your team or use case.

In this article, I would like to introduce you to Cypress, the open-source next-generation automation testing tool built for modern web applications written in JavaScript and built on Node.js. Cypress may be all you need for your Automation testing needs.

What is E2E Testing?

End-to-end (E2E) testing is a type of software testing that evaluates an application’s functionality from start to finish, simulating real user scenarios. It involves testing the entire flow of an application, including user interfaces, interactions with databases, APIs, network communications, and other integrated systems.

What is Cypress? 

It is an open-source end-to-end testing framework designed to simplify the process of writing, running, and debugging tests for modern web applications. Unlike traditional testing tools, Cypress runs directly in the browser, allowing for fast and reliable testing of your application’s critical functionalities. Cypress solves the key pain points developers and QA engineers face when testing modern applications. E.g., synchronization issues, the inconsistency of tests due to elements not visible or available, etc.

Why choose Cypress for E2E Testing?

Working with any tool requires that you understand its merits and demerits before you get started otherwise, you will be stuck. Here are a few benefits of Cypress for E2E Testing:

  • Fast Execution Speed: Cypress’ architecture enables blazingly fast test execution, making it ideal for running tests quickly during development cycles.
  • Easy Setup: With minimal dependencies and a simple installation process, getting started with Cypress is a breeze.
  • Developer-friendly: Cypress is built with JavaScript, which is a widely used programming language among developers. This makes it easier for developers to write and maintain test scripts.
  • Interactive Test Runner: Cypress provides an interactive test runner that allows developers to see what’s happening in their tests in real-time. They can debug and troubleshoot issues more efficiently with features like live reloading and time-traveling debugger.
  • Automatic Waiting: Cypress automatically waits for elements to appear on the page before performing actions, reducing the need for manual timeouts and improving test reliability.
  • Built-in Assertions: Cypress comes with built-in assertions that make it easier to write expressive and readable test cases.
  • Network Traffic Control: Cypress allows developers to control and manipulate network traffic, enabling them to simulate various network conditions and test edge cases.
  • Comprehensive Testing Capabilities: From end-to-end testing to unit testing, Cypress offers a wide range of testing functionalities, allowing you to cover all aspects of your application’s behaviour.
  • Cross-browser Testing: Cypress supports cross-browser testing, allowing developers to test their applications across different browsers seamlessly.

The mocking of server requests and responses can be used to test edge scenarios.

  • API testing capabilities.
  • According to the latest update, we can now test Cross-Domain test scenarios.
  • It captures Videos or Screenshots at the time of test execution.
  • To verify and control the behavior of server responses, functions, or timers, developers or QA experts can use Spies, Stubs, and Clocks.
  • Cypress Dashboard shows you every detail of your test execution, including assertions, network requests, page loads, stubs, and spies.
  • There is no necessity for JSON Wire (or some other protocol) in Cypress. Since Cypress operates within the application, the test code can access all the objects (not limited to DOM elements) that the application code can.
  • It supports parallel testing (or parallelization) by default. It also lets you group tests by Browsers, test labels, and more by grouping test runs. Here is a short depiction of parallel testing with Cypress.

Disadvantages of Cypress

  • Cypress can only be used in browsers.
  • There is no support for multiple tabs or windows.
  • Cypress currently supports JavaScript and TypeScript for creating test cases.
  • There is no support for Safari.
  • It is not possible to run multiple browser sessions at the same time.


Before diving into Cypress, ensure you have the following prerequisites installed on your system:

Node.js: Cypress requires Node.js to run. You can download and install Node.js from the official website or use a package manager like npm or yarn.

Code Editor: Choose a code editor that fits your preference. Popular choices include Visual Studio Code, Sublime Text, or Atom.

Cypress installation

Cypress is very easy to install. The only thing you need to do is run a few commands in your text editor (VS Code) terminal, and you’re ready to create your automation scripts. It’s just like installing a game and starting it. Follow the given steps for a smooth installation:

Step 1: Install Node.js and Node Package Manager (NPM)

When you install node.js, make sure you are going to install the Latest Stable version (LTS) for your machine. Node is available for many operating systems, so download as per your system requirements.

A screenshot of a computer

Description automatically generated

If you want to check whether the node.js and npm have been successfully installed or not. You can use the below command in your command prompt (CMD):

  • node -v
  • npm -v

Step 2: Create a Project folder

Cypress is installed locally in your project folder, i.e., we need to create a folder before installing the Cypress. We can create our folder by using CTRL + SHIFT + N and rename it with your project name or by using terminal commands, which are given below:

  • mkdir foldername — make directory/folder
  • cd foldername — change directory/folder

Step 3: Create a package.json file

The package.json file is the heart of any project. It records important metadata about a project and defines functional attributes of a project that npm uses to install dependencies, run scripts, and identify the entry point to our package.

  • npm init -y
A screenshot of a computer program

Description automatically generated

After running this command, the One package.json file will be created with some default values.

Step 4: Install Cypress

npm install cypress — save-dev

A screenshot of a computer program

Description automatically generated

Now after completing all the installation processes, you will get a successful message in your terminal and one folder named node_module will be added to your folder structure along with the package-lock.json file.

Step 5: Open Cypress test runner

To run the cypress test cases, we need to open its test runner, so the commands to run cypress are:

  • \node_modules\.bin\cypress open or
  • npx cypress open
A screenshot of a computer

Description automatically generated

After running the above command, you will find many new files/folders named cypress, e2e, fixtures, and support in your folder structure, and inside this folder, you will see the architectural design of cypress. The white window in the center is the test runner window; through this you can execute your test cases very easily. Cypress provides you with some pre-defined test suits inside the e2e folder.

A screenshot of a computer

Description automatically generated


Considering Cypress’s relatively easy learning curve, you can start creating meaningful tests quickly. Another great thing about Cypress is that they are constantly resolving its shortcomings.

In general, I found Cypress to be a very handy and easy-to-use tool for doing end-to-end testing. I can cover most of my needs with just a few built-in commands and find additional help with third-party packages when needed. Despite that, Cypress has its shortcomings. In some cases, parts of the application do not load quickly enough, and the tests fail due to an insufficient default wait time. Cypress then times out while it waits for the element to show up. Despite these faults, I would still recommend Cypress to anyone who needs end-to-end testing for their app.