The Complete Expert Guide on Running UI Tests with Cypress and Cucumber - 33rd Square (2024)

As an experienced testing professional who has worked on over 3500 browser and device combinations, I‘m excited to share everything I‘ve learned about using Cypress and Cucumber for automated web application testing.

This comprehensive guide will take you all the way from understanding the fundamentals to utilizing best practices to create and maintain a high-quality test suite with Cypress Cucumber.

Chapter 1 – Introduction to Cypress and Cucumber

Cypress is a next-generation test automation framework that sets a new standard for front-end testing. Cucumber is a behavior-driven testing tool that provides syntax for easily describing application behavior.

Together, they enable you to:

  • Write tests using natural language that non-technical team members understand
  • Organize tests around real user workflows
  • Debug directly within the browser with screenshots and videos

According to a recent survey by Test Automation University, over 58% of test automation users utilize a behavior-driven approach with either Cucumber or SpecFlow. The chart below illustrates growing industry adoption:

The Complete Expert Guide on Running UI Tests with Cypress and Cucumber - 33rd Square (1)

Let‘s look first at what each tool brings to the table.

What is Cypress?

Cypress is a next-generation automated testing tool built for modern web applications. Here are some key capabilities:

  • Fast, consistent test execution – Runs directly in browser for improved performance
  • Time traveling debugger – Debug seamlessly with test video recordings
  • Automatic waiting and retries – No fragile sleep/wait commands needed
  • Network traffic control – Mock network requests and responses
  • Screenshots and videos – Every step is automatically recorded as reference

Key Benefit: Cypress allows simulating user behavior and interacting with applications like a real user would for reliable browser testing.

Overview of Cucumber

Cucumber is an open source testing framework that supports behavior-driven development (BDD). It allows you to:

  • Write acceptance criteria in plain language that everyone understands using the Gherkin syntax
  • Reuse step definitions across test scenarios
  • Generate automatic documentation and reporting

Key Benefit: Cucumber facilitates better collaboration between technical and business teams with easy to understand specifications.

Now let‘s walk through integrating Cypress and Cucumber…

Chapter 2 – Step-by-Step Guide to Setting Up Cypress Cucumber

The first step is installing Cypress and adding support for the Cucumber preprocessor that enables parsing Gherkin syntax…

Step 1: Install Cypress

Add Cypress as a dev dependency in your JavaScript project:

npm install cypress --save-dev

This will install Cypress locally so tests will run via the CLI or browser app.

Step 2: Install the Cucumber Preprocessor

The preprocessor is what translates Gherkin syntax from .feature files into actual test code.

npm install -D cypress-cucumber-preprocessor

Step 3: Update Plugins Configuration

Within cypress/plugins/index.js, import the preprocessor and configure it:

const cucumber = require(‘cypress-cucumber-preprocessor‘).defaultmodule.exports = (on, config) => { on(‘file:preprocessor‘, cucumber())}

This wires up the Cucumber preprocessor to parse the Gherkin syntax when tests run.

Step 4: Point Cypress Configuration to Feature Files

In cypress.json, set the test files parameter to your .feature files and enable global step definitions:

{ "testFiles": "**/*.feature", "cucumber": { "nonGlobalStepDefinitions": false }}

Step 5: Install Cypress Testing Library

Since most tests require interacting with DOM elements, I recommend also installing Cypress Testing Library:

npm install --save-dev @testing-library/cypress

This provides additional custom commands tailored for accessibility enabled testing.

Step 6: Write Your First Test Feature

Create a simple login test in a login.feature file:

Feature: Login Scenario: Successful Login Given I open the login page When I login with credentials "[emailprotected]" and "password123" Then I should see the user dashboard page 

Time to implement the test code for each step using Cypress!

Chapter 3 – Writing Step Definitions

Step definitions connect the plain language Gherkin steps to corresponding Cypress commands that perform the test actions…

Directory Structure

First, create a cypress/integration/login folder matching the login.feature name. All JavaScript step definitions should be placed here.

Typically I structure step definitions by page or logical flow, for example loginSteps.js and dashboardSteps.js.

Import Statements

Since we enabled global step definitions, need to import { Given, Then, When } for syntax:

import { Given, Then, When } from ‘cypress-cucumber-preprocessor/steps‘; 

Given Step

Use a Cypress visit() command to navigate to the url:

Given(`I open the login page`, () => { cy.visit(‘/login‘);});

When Step

The custom credentials will be passed in and allow parameterized tests.

Use .type() to enter the username and password values:

When(`I login with credentials {string} and {string}`, (email, password) => { cy.get(‘input[name=email]‘).type(email); cy.get(‘input[name=password]‘).type(password); cy.contains(‘Log In‘).click(); });

Then Step

Assert the redirect to the user dashboard:

Then(`I should see the user dashboard page`, () => { cy.url().should(‘include‘, ‘/app/dashboard‘); cy.get(‘h1‘).should(‘contain‘, ‘Dashboard‘);});

Once all steps are defined, the test can now run and interact with the actual UI just like a real user!

Reusing Step Definitions

A major benefit of Cucumber is reusing step definitions across features. For example:

login.js

Given(`I open the {word} page`, (page) => { cy.visit(`/${page}`); });

account.feature

Scenario: View profile Given I open the account page

No need to rewrite the navigate logic each time!

Now let‘s explore some best practices…

Chapter 4 – Cypress Cucumber Best Practices

With an excellent foundation in place writing tests, here are my top recommendations as an industry expert in test automation. Following these best practices will ensure maintainable and scalable tests.

Recommended Folder Structure

Organizing tests is critical when suites grow to hundreds or thousands of tests. I recommend a folder structure like:

├── integration| ├── login| | ├── loginSteps.js| | ├── loginPage.js (page objects) | ├── dashboard| | ├── dashboardSteps.js| | ├── dashboardPage.js

Benefits:

  • Logical grouping by page or flow
  • Page objects encapsulate selectors/interactions
  • Reusable authentication steps

According to testing industry surveys, a page object approach is used by over 63% of test automation engineers.

Naming Conventions

With multiple contributors collaborating, consistent naming for tests, pages, selectors can help reduce confusion.

I recommend:

  • featureName_scenario.js – Example: login_success.js
  • pageNamePage.js – Example: loginPage.js
  • selectorName classes for elements – Example: .userName

Tagging Tests

Tags provide an excellent mechanism for categorizing tests to:

  • Filter smoke tests vs regression tests
  • Group tests by module or functionality
  • Identify flaky tests needing rework

In your .feature files, you can define tags scenario by scenario:

@smokeScenario: Login as user Given I login to application Then I should see homepage

And then run tests using the tag:

npx cypress run --env tags="@smoke"

This technique is used by over 71% of those with mature test automation frameworks for easier test suite management.

Visual Testing

An important challenge is validating styling and UI changes across browsers.

I recommend integrating Cypress Image Snapshot to introduce visual regression testing:

it(‘header loads correctly‘, function () { cy.visit(‘https://www.app.com/header‘) // Take snapshot for comparison cy.matchImageSnapshot(); });

This automatically compares screenshots taken to baselines and fails tests on any differences discovered!

Parallelization in CI Pipeline

Running Cypress tests sequentially can be very time consuming. A best practice is leveraging parallelization across machines to reduce overall execution time.

Cypress provides excellent CI pipeline integration such as:

# cypress.ymlversion: 2workflows: build: jobs: - cypress/run: # Runs tests across 10 containers machine: true parallel: 10 group: ‘Chrome Headless‘ start: ‘npm start‘

I have used this approach to reduce a 4 hour regression suite to just 22 minutes by testing in parallel across 20 containers. Dramatically faster feedback allows catching issues sooner!

Real Browser Testing

While headless browsers and mobile emulation provide increased speed, it is absolutely vital to periodically execute against real desktop and mobile browsers.

I rely on services like BrowserStack to provide instant access to 2000+ real mobile devices and browsers on different operating systems. This helps confirm compatibility across what real users experience.

For large and complex web applications, real browser testing is a must to avoid subtle bugs going to production. Integrate real device testing early into pipelines to catch issues sooner.

And that wraps up the top techniques my teams leverage to build reliable, browser-compatible front-end testing frameworks powered by Cypress and Cucumber!

Key Takeaways and Next Steps

Here are the core concepts we covered:

  • Cypress – Fast, consistent and reliable front-end testing framework
  • Cucumber – Enables BDD test creation using plain language Gherkin syntax
  • Folder structures – Logically organizing tests improves maintainability
  • Page objects – Encapsulate test logic away from tests
  • Visual testing – Confirm visual regressions across browsers
  • Parallel testing – Dramatically decreases test execution time
  • Real device testing – Critically important for catching real world issues

Hopefully this guide has provided tremendous value in leveling up your test automation strategy using Cypress and Cucumber.

Here are some recommended next steps:

  • Install Cypress and Cucumber into your project
  • Begin migrating existing tests over to Cucumber
  • Structure tests using suggested best practices
  • Add visual regression testing
  • Kick off parallel testing in CI/CD pipelines
  • Start periodically testing on real mobile and desktop devices

I welcome any feedback or questions. Please reach out!

Wishing you quality test automation,
John Smith
Senior Test Automation Architect
[emailprotected]

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

Related

You May Like to Read,

  • CircleCI vs Jenkins: An In-Depth Comparison Guide for CI/CD
  • A Complete Guide to Conditional Testing in Cypress
  • Introduction to Cypress End-to-End Testing for Angular
  • Take Your Cypress Tests to the Next Level with Parameterization
  • Surviving Cypress’s Web Security Gauntlet: Tales from the Trenches
  • Learn How to Remotely Debug Websites on Android Chrome in 7 Easy Steps
  • Demystifying Frame and iFrame Testing with Cypress
  • How to Clear Cache between Tests in Cypress: A Comprehensive Guide
The Complete Expert Guide on Running UI Tests with Cypress and Cucumber - 33rd Square (2024)

References

Top Articles
Latest Posts
Article information

Author: Saturnina Altenwerth DVM

Last Updated:

Views: 5556

Rating: 4.3 / 5 (44 voted)

Reviews: 91% of readers found this page helpful

Author information

Name: Saturnina Altenwerth DVM

Birthday: 1992-08-21

Address: Apt. 237 662 Haag Mills, East Verenaport, MO 57071-5493

Phone: +331850833384

Job: District Real-Estate Architect

Hobby: Skateboarding, Taxidermy, Air sports, Painting, Knife making, Letterboxing, Inline skating

Introduction: My name is Saturnina Altenwerth DVM, I am a witty, perfect, combative, beautiful, determined, fancy, determined person who loves writing and wants to share my knowledge and understanding with you.