Mastering Cypress With Best Practices for Effective Test Automation in 2024

Cypress automation services

If you are searching for the most reliable automation testing framework, check out Cypress. It is the most user-friendly automation framework, so it is gaining more attention among developers for end-to-end testing. The best aspect is that it is open-source and won’t break the bank. But like any other tool, you must master it by implementing the best practices.

Adopting these practices can bring significant benefits to your project. They can also help you avoid typical blunders that hinder progress. Additionally, they empower teams to mitigate risks, ensuring smooth operation. So, join us as we explore the proven methodology to enhance your testing efforts. Let’s use these practices to reduce bottlenecks and pave the way for innovation.

Cypress Best Practices You Need to Know

Adding BaseUrl in the config file

In Cypress, setting the base URL in the `cypress.json` configuration file is a more efficient and professional approach than hard-coding it in each spec file. It ensures consistency and avoids unnecessary URL reloading during test automation execution. Here’s how you can do it:

1. Remove the hard-coded base URL from your spec file’s `before()` block:


// Remove this from your spec file

before(() => {




2. Set the base URL in your `cypress.json` configuration file:


// cypress.json



"baseUrl": "http://localhost:3000",




3. Update your spec file to use the base URL for navigation:


// Update your spec file

before(() => {

cy.visit("/login"); // Uses the base URL defined in cypress.json



Defining the base URL in `cypress.json` is one of the vital Cypress best practices. It will ensure cleaner and more efficient test code.

Avoid Unnecessary Wait

Avoid using static wait commands like `cy.wait(timeout)` in Cypress tests. They cause unnecessary delays and reduce test reliability.

For example, instead of using:





Where the test waits for 5 seconds after visiting the website, even if it loads faster, opt for dynamic waiting using `cy.intercept()`:






.should('eq', 200)


Minimizing unnecessary waits in cross-browser testing helps improve your test suite’s efficiency, reliability, and maintainability. It ensures a smoother testing experience for both testers and end-users.

Independent it() blocks

Use the `it()` block in Cypress test scripts to define individual test cases. These `it()` blocks are typically grouped inside a `describe()` block in a spec file.

A crucial coding standard we adhere to is that each `it()` block should be independent of the others. It means that the code within one `it()` block should not rely on the execution or outcome of another `it()` block.

This coding practice ensures test independence. When Cypress automation services run a spec file containing multiple `it()` blocks (e.g., 10 test cases), and if one `it()` block fails, it should not affect the execution or result of the remaining blocks. It allows us to isolate failures and accurately identify issues in specific test cases.

In contrast, if there is a dependency between `it()` blocks where one block relies on the outcome of another, a failure in one `it()` block can cascade and cause subsequent test cases to fail.

Maintaining independence between `it()` blocks ensures each test case runs in isolation, promoting better test stability and easier debugging in the Cypress automation tool.

Using Hooks

When repetitive code needs to be executed before or after each test case in a spec file, it’s best to use Cypress hooks. These hooks avoid duplication and ensure code reusability.

Here’s how you can utilize the different hooks available in Cypress:

1. beforeEach(): Use this hook to execute common code before each test case in the spec file, such as setting up test data or logging in before each test.

2. afterEach(): Cypress testing Companies use this hook to execute common code after each test case. It helps them clean up after tests, such as logging out or resetting data.

3. before(): Use this hook to write standard code to be executed once before all test cases in the spec file. It helps set up the environment or perform initial configurations.

4. after(): Use this hook to execute common code after executing all test cases in the spec file. It can be used to do final cleanup chores and generate test reports.

Using the “data-cy” attribute for identifying locators

To avoid potential failures in the future due to changes in class names or ID values, testing automation companies use the “data-cy” attribute for identifying locators. This attribute is designated for QA purposes and is less likely to be modified by developers.

Instead of relying on class names or IDs, use the “data-cy” attribute in your HTML elements. Here’s an example of how you can define locators using the “data-cy” attribute:



In your Cypress tests, you can then target these elements using the “data-cy” attribute, ensuring more robust and resilient tests:




This approach decouples tests from the specific implementation details of the UI elements, helping automation testing companies produce more reliable test results even when the frontend code frequently changes.

Using clear() Command

Using the `clear()` command before `type()` in Cypress tests is recommended, especially when dealing with text boxes. Here’s why:

1. Clear Existing Value: `clear()` ensures that any existing value in the text box is removed before typing a new value. It helps avoid potential conflicts or the concatenation of old and new values.

2. Ensures Accuracy: By clearing the text box first, you ensure that the value entered using `type()` is the exact value specified in your test script. It helps you adhere to the best practices for improving test accuracy.

Here’s an example of how you can use `clear()` before `type()` in Cypress:


cy.get('[data-cy=emailInput]').clear().type('[email protected]');


Defining “scripts” in package.json

By defining scripts in package.json, you can quickly run Cypress commands using shorter, more convenient names. Plus, if you have other commands or scripts you frequently use, you can add them to the “scripts” section for easier access and execution. Here’s how you can define the “test automation scripts” section in your package.json file to include the Cypress open command:



"name": "your-project-name",

"version": "1.0.0",

"description": "Your project description",

"scripts": {

"cy:open": "cypress open"


"dependencies": {

"cypress": "^9.5.0"


"devDependencies": {},

"keywords": [],

"author": "Your Name",

"license": "ISC"



In the above example:

- `"cy:open"` is the user-defined name for the Cypress open command.

- `"cypress open"` is the actual command executed when you run `npm run cy:open` in your terminal.


Cypress offers a unique JavaScript-based architecture that ensures consistent and reliable test results. Features like real-time execution, debugging, and network traffic control further enhance the efficiency of the software testing process. Maximizing the benefits requires a thorough implementation of the industry’s best practices. These techniques will assist you in improving your performance. Even though they may appear difficult initially, they are beneficial in the long run. Apart from enhancing your efficiency, these practices also foster a culture of innovation. So, immediately put them into action and watch your business thrive, thanks to a smooth digital experience.

The following two tabs change content below.


Co-Founder & Director, Business Management
AutomationQA is a leading automation research company. We believe in sharing knowledge and increasing awareness, and to contribute to this cause, we try to include all the latest changes, news, and fresh content from the automation world into our blogs.