Bird
Raised Fist0
Cypresstesting~15 mins

Component testing vs E2E in Cypress - Automation Approaches Compared

Choose your learning style10 modes available
Test a Button Component and Full Login Flow
Preconditions (3)
Step 1: Open the Button component in isolation
Step 2: Verify the button renders with text 'Submit'
Step 3: Click the button and verify the click handler is called
Step 4: Navigate to the login page of the application
Step 5: Enter 'user@example.com' in the email input field
Step 6: Enter 'Password123' in the password input field
Step 7: Click the login button
Step 8: Verify the URL changes to '/dashboard'
Step 9: Verify the dashboard page contains the text 'Welcome, user!'
✅ Expected Result: The Button component renders correctly and responds to clicks. The login flow completes successfully, redirecting to the dashboard with welcome text.
Automation Requirements - Cypress
Assertions Needed:
Button text is 'Submit'
Click handler is called on button click
URL changes to '/dashboard' after login
Dashboard page contains 'Welcome, user!' text
Best Practices:
Use Cypress component testing for the Button component
Use Cypress E2E testing for the login flow
Use data-cy attributes for selectors
Use explicit assertions for visibility and content
Avoid hardcoded waits; use Cypress commands that wait automatically
Automated Solution
Cypress
/// <reference types="cypress" />

// Component Test for Button
import Button from '../../src/components/Button.vue';

describe('Button Component Test', () => {
  it('renders with text and responds to click', () => {
    const onClick = cy.stub();
    cy.mount(<Button onClick={onClick}>Submit</Button>);
    cy.get('[data-cy=button]').should('be.visible').and('have.text', 'Submit');
    cy.get('[data-cy=button]').click().then(() => {
      expect(onClick).to.have.been.calledOnce;
    });
  });
});

// E2E Test for Login Flow
describe('Login Flow E2E Test', () => {
  it('logs in and redirects to dashboard', () => {
    cy.visit('/login');
    cy.get('[data-cy=email-input]').type('user@example.com');
    cy.get('[data-cy=password-input]').type('Password123');
    cy.get('[data-cy=login-button]').click();
    cy.url().should('include', '/dashboard');
    cy.get('[data-cy=welcome-text]').should('contain.text', 'Welcome, user!');
  });
});

The solution has two parts: component test and E2E test.

In the component test, we mount the Button component using Cypress component testing. We pass a stub function to track clicks. We check the button text and simulate a click, then verify the click handler was called once.

In the E2E test, we visit the login page URL. We fill the email and password fields using selectors with data-cy attributes. We click the login button, then verify the URL changed to the dashboard. Finally, we check the dashboard page shows the welcome message.

This separation shows how component testing focuses on a small piece in isolation, while E2E tests the full user flow in the real app.

Common Mistakes - 4 Pitfalls
Using CSS selectors like classes or IDs that may change
Using hardcoded waits like cy.wait(5000)
Mixing component testing code with E2E testing code in one test
Not verifying the click handler was called in component test
Bonus Challenge

Now add data-driven testing for the login flow with 3 different user credentials

Show Hint

Practice

(1/5)
1. What is the main focus of component testing in Cypress?
easy
A. Testing the entire app flow from start to finish
B. Testing individual parts of the app in isolation
C. Checking the app's performance under load
D. Verifying database connections

Solution

  1. Step 1: Understand component testing scope

    Component testing focuses on small parts or components of the app, testing them alone without the full app context.
  2. Step 2: Compare with other testing types

    E2E testing checks the whole app working together, so it is not the focus of component testing.
  3. Final Answer:

    Testing individual parts of the app in isolation -> Option B
  4. Quick Check:

    Component testing = isolated parts [OK]
Hint: Component testing isolates parts, not full app [OK]
Common Mistakes:
  • Confusing component testing with E2E testing
  • Thinking component testing checks full app flow
  • Assuming component testing checks performance
2. Which of the following is the correct Cypress command to mount a React component for component testing?
easy
A. cy.visit('/component')
B. cy.request('/api/component')
C. cy.mount()
D. cy.get('MyComponent').click()

Solution

  1. Step 1: Identify component testing command

    In Cypress component testing, cy.mount() is used to render a component in isolation.
  2. Step 2: Eliminate other commands

    cy.visit() is for E2E page visits, cy.get() selects elements, and cy.request() makes HTTP calls, none mount components.
  3. Final Answer:

    cy.mount(<MyComponent />) -> Option C
  4. Quick Check:

    Mount component = cy.mount() [OK]
Hint: Use cy.mount() to render components in tests [OK]
Common Mistakes:
  • Using cy.visit() for component testing
  • Confusing cy.get() with mounting
  • Trying to mount components with cy.request()
3. Given this Cypress E2E test code, what will be the output in the test report?
describe('Login flow', () => {
  it('should show error on wrong password', () => {
    cy.visit('/login')
    cy.get('input[name="username"]').type('user1')
    cy.get('input[name="password"]').type('wrongpass')
    cy.get('button[type="submit"]').click()
    cy.contains('Invalid credentials').should('be.visible')
  })
})
medium
A. Test passes without checking any message
B. Test fails because cy.visit() is not allowed in E2E
C. Test fails due to syntax error in selectors
D. Test passes if 'Invalid credentials' message appears

Solution

  1. Step 1: Analyze test steps

    The test visits the login page, enters username and wrong password, clicks submit, then checks for error message visibility.
  2. Step 2: Verify correctness of commands

    All commands are valid Cypress E2E commands. The assertion checks if the error message is visible, so test passes if message appears.
  3. Final Answer:

    Test passes if 'Invalid credentials' message appears -> Option D
  4. Quick Check:

    E2E test passes if error message visible [OK]
Hint: E2E tests check full flow and visible messages [OK]
Common Mistakes:
  • Thinking cy.visit() is invalid in E2E
  • Ignoring the assertion on error message
  • Assuming syntax errors in selectors without cause
4. Identify the error in this Cypress component test code:
import MyButton from './MyButton'
describe('MyButton component', () => {
  it('renders button text', () => {
    cy.mount(MyButton)
    cy.get('button').should('contain.text', 'Click me')
  })
})
medium
A. Missing JSX syntax when mounting component
B. cy.get selector is incorrect
C. cy.mount cannot be used in component tests
D. No assertion is present

Solution

  1. Step 1: Check component mounting syntax

    In Cypress component testing, components must be mounted using JSX syntax like cy.mount(<MyButton />), not just the component name.
  2. Step 2: Verify other parts

    The selector cy.get('button') and assertion are correct. cy.mount is valid in component tests.
  3. Final Answer:

    Missing JSX syntax when mounting component -> Option A
  4. Quick Check:

    Use JSX syntax in cy.mount() [OK]
Hint: Always wrap component in <> when mounting [OK]
Common Mistakes:
  • Passing component without JSX syntax to cy.mount
  • Thinking cy.mount is invalid in component tests
  • Misreading selector as incorrect
5. You want to test a login form component in isolation but also verify the full login flow including navigation. Which Cypress testing approach should you use for each task?
hard
A. Use component testing for form UI; use E2E testing for full login flow
B. Use E2E testing for form UI; use component testing for full login flow
C. Use only component testing for both tasks
D. Use only E2E testing for both tasks

Solution

  1. Step 1: Match testing types to tasks

    Component testing is best for isolated UI parts like the login form component itself.
  2. Step 2: Use E2E for full app flow

    To verify the entire login flow including navigation and backend, E2E testing is appropriate.
  3. Final Answer:

    Use component testing for form UI; use E2E testing for full login flow -> Option A
  4. Quick Check:

    Component = UI parts, E2E = full flow [OK]
Hint: Component tests parts; E2E tests whole app flow [OK]
Common Mistakes:
  • Mixing up which test type suits UI vs full flow
  • Trying to test full flow with component tests
  • Ignoring navigation in login flow testing
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard