Testing Strategies

Balancing test coverage, development speed, and confidence in your frontend application.

Quick Navigation: Testing Pyramid Unit Tests Integration E2E Comparison

The Testing Trade-off

More tests = More confidence but slower development. Finding the right balance is key.

  • Coverage vs Speed: 100% coverage slows development
  • Unit vs E2E: Different confidence levels and maintenance costs
  • Mocking vs Real: Fast tests vs realistic scenarios

Testing Pyramid vs Trophy

Traditional Pyramid

E2E (Few)
Integration (Some)
Unit (Many)

Traditional approach: Many fast unit tests, few slow E2E tests.

Testing Trophy (Kent C. Dodds)

E2E (Few)
Integration (Most)
Unit (Some)

Focus on integration tests for best confidence-to-effort ratio.

Unit Tests

Test individual functions, components, or modules in isolation.

Advantages

  • Fast: Milliseconds to run
  • Precise: Easy to pinpoint failures
  • Cheap: Low maintenance cost
  • TDD-friendly: Easy to write first

Disadvantages

  • Low confidence: Doesn't test integration
  • Mocking overhead: Need to mock dependencies
  • False positives: Tests pass but app broken

🎯 Best For:

Pure functions, utility libraries, complex business logic, reducers, custom hooks.

Integration Tests

Test multiple components working together, often with Testing Library.

Advantages

  • High confidence: Tests user flows
  • Realistic: Tests components together
  • Refactor-safe: Less coupled to implementation
  • Best ROI: Confidence vs maintenance ratio

Disadvantages

  • Slower: More setup, more components
  • Harder debugging: Failure could be anywhere
  • Mock APIs: Still need to mock external calls

🎯 Best For:

User interactions, form submissions, component composition, feature flows.

End-to-End Tests

Test entire application from user's perspective with Playwright, Cypress, or Selenium.

Advantages

  • Highest confidence: Tests real user flows
  • Full stack: Tests frontend + backend + DB
  • No mocking: Real services and data
  • Visual testing: Can catch CSS issues

Disadvantages

  • Slow: Minutes to run full suite
  • Flaky: Network, timing issues
  • Expensive: Infrastructure, maintenance
  • Hard debugging: Many layers to investigate

🎯 Best For:

Critical user journeys, checkout flows, authentication, smoke tests before deploy.

Comparison Table

AspectUnitIntegrationE2E
SpeedVery FastMediumSlow
ConfidenceLowHighHighest
MaintenanceLowMediumHigh
FlakinessRareOccasionalCommon
ToolsJest, VitestTesting LibraryPlaywright, Cypress

Best Practices

  • 1.Focus on integration tests. Best confidence-to-maintenance ratio.
  • 2.Test user behavior. Not implementation details.
  • 3.Critical paths get E2E. Checkout, auth, core features.
  • 4.Unit test complex logic. Calculations, transformations, utils.
  • 5.Mock at network level. MSW for consistent API mocking.