React E2E Testing with Cypress – Full App Workflow Testing (2025 Guide)
Introduction – What is E2E Testing with Cypress?
End-to-End (E2E) testing simulates real user interactions by running tests in a browser environment, validating your app’s complete workflow—UI, routing, APIs, and state.
Cypress is one of the most popular frameworks for E2E testing in React.js:
- Fast, reliable, browser-based tests
- Built-in screenshots and video recording
- Real DOM and network stubbing
- Great for CI/CD pipelines
In this guide, you’ll learn:
- How to install and configure Cypress
- Write tests for routing, forms, and API flows
- Mock APIs and UI states
- Best practices for scalable E2E test suites
1. Installing and Running Cypress
Install Cypress:
npm install --save-dev cypress
Add to Scripts:
"scripts": {
"cypress:open": "cypress open",
"cypress:run": "cypress run"
}
Launch Cypress UI:
npm run cypress:open
Opens the visual Cypress test runner in your browser.
2. Cypress Project Structure
cypress/
├── e2e/
│ └── home.cy.js # E2E test files
├── fixtures/ # Test data (JSON, mocks)
├── support/ # Global config/hooks
cypress.config.js # Cypress configuration
All test files go in cypress/e2e/*.cy.js
3. First Cypress Test – Visit & Assert
// cypress/e2e/home.cy.js
describe('Home Page', () => {
it('loads and displays welcome text', () => {
cy.visit('/');
cy.contains('Welcome to React App');
});
});
Cypress opens a real browser and checks for UI elements
Assertions based on real DOM (like a real user)
4. Test Forms & Inputs
describe('Login Form', () => {
it('submits with valid credentials', () => {
cy.visit('/login');
cy.get('input[name=email]').type('user@example.com');
cy.get('input[name=password]').type('password123');
cy.get('button[type=submit]').click();
cy.contains('Dashboard');
});
});
Use cy.get(), cy.contains(), cy.type(), cy.click()
Simulates a real user typing and submitting a form
5. Mock API Responses with Intercepts
cy.intercept('GET', '/api/posts', {
statusCode: 200,
body: [{ id: 1, title: 'Mock Post' }]
}).as('getPosts');
cy.visit('/posts');
cy.wait('@getPosts');
cy.contains('Mock Post');
Stubs backend APIs
Speeds up tests and avoids dependency on real servers
6. Routing & Navigation
cy.visit('/');
cy.get('a[href="/about"]').click();
cy.url().should('include', '/about');
cy.contains('About Page');
Tests your SPA navigation just like a user
Use assertions on url, pathname, or location
7. Custom Commands & Reusability
// cypress/support/commands.js
Cypress.Commands.add('login', () => {
cy.visit('/login');
cy.get('input[name=email]').type('admin@site.com');
cy.get('input[name=password]').type('admin123');
cy.get('button[type=submit]').click();
});
Call with cy.login() in any test
DRY test code with custom commands
8. CI/CD Integration
GitHub Actions Example:
- name: Run Cypress Tests
run: npm run cypress:run
Supports Jenkins, GitLab, CircleCI, Netlify, Vercel
9. Cypress Best Practices
| Do | Avoid |
|---|---|
| Use data-testid for selectors | Relying on class names or text |
Mock API calls with intercept | Hit real servers in CI |
Use beforeEach() to reset state | Duplicate setup code in tests |
| Group tests logically | Huge single test file |
| Run in headless mode in CI | GUI mode for automation |
Summary – Recap & Next Steps
Cypress gives you a production-like browser environment for E2E testing React apps. From login forms to navigation to API mocking—it ensures your UI workflows work just like your users expect.
Key Takeaways:
- Cypress runs fast, real-browser tests
- Use
cy.visit(),cy.get(),cy.contains()to simulate users - Use
cy.intercept()to mock APIs - Create reusable commands for DRY test suites
- Integrate with CI/CD for automated release checks
Real-World Relevance:
Cypress is used in apps like Slack, Netflix, Shopify, and Vercel to ensure end-to-end workflows like checkout, dashboard, and onboarding never break in production.
FAQ Section
Is Cypress only for E2E testing?
Mostly, but it can also be used for component testing with frameworks like Vite or Next.js.
Can Cypress test React state or props?
No. Cypress tests from the user perspective—not internal state. Use unit tests for that.
Can Cypress test mobile views?
Yes. Use cy.viewport() to simulate different screen sizes.
How do I debug failing tests in Cypress?
Cypress UI shows the browser DOM snapshot on failure. Use .debug() or .pause() for live debugging.
Can I use Cypress with React Router or Redux?
Yes. You can test any framework or state manager, as long as it renders in the browser.
Share Now :
