Back to Blog
Engineering & Development June 7, 2026 9 min read

End-to-End Testing and Test Coverage: What Actually Matters

Test coverage numbers lie. 100% coverage doesn't mean bug-free software. Here is what to measure, what to test, and where most teams waste their testing budget.

Lars Krueger
Lars Krueger
Founder & CEO
End-to-end testing and test coverage guide

Your test suite reports 85% code coverage. You feel confident. Then a user reports that the checkout flow is broken β€” a scenario that was technically covered by tests but never actually tested as a complete flow.

This is the gap between coverage metrics and confidence.

The Testing Pyramid β€” and Why Most Teams Invert It

Martin Fowler's testing pyramid recommends many unit tests, fewer integration tests, and even fewer end-to-end tests. The reasoning is sound: unit tests are fast, cheap, and stable. E2E tests are slow, expensive, and flaky.

But most teams unknowingly invert this pyramid:

  • Too few unit tests: Business logic lives untested in controllers and services
  • Almost no integration tests: Database queries, API calls, and external services are mocked away
  • Manual E2E testing: Someone clicks through the app before each release and hopes they remember all the edge cases

According to the World Quality Report[1] published by Capgemini, organizations spend roughly 23% of their IT budgets on quality assurance and testing. Yet research by Stripe[2] estimated that developers spend approximately 33% of their time on maintenance and technical debt, much of which involves fixing bugs that testing should have caught.

What Test Coverage Actually Measures

Test coverage measures how much of your code executes when tests run. It does not measure:

  • Whether the tests check the right things
  • Whether the user experience works end-to-end
  • Whether edge cases are handled
  • Whether integrations with external services work

A function can be "covered" by a test that calls it without asserting anything meaningful. This is why chasing coverage numbers without considering test quality is counterproductive.

Useful Coverage Targets

Instead of a single coverage number, track coverage by layer:

Layer Target Why
Business logic (services, domain) 80-90% This is where bugs are expensive
API endpoints 70-80% Integration points catch mismatch issues
UI components 50-70% Visual regressions are caught by E2E and visual diff
Utility functions 90%+ Pure functions are easy to test thoroughly
Configuration / glue code Skip Testing config files adds noise, not confidence

The 2024 State of Testing report by PractiTest[3] found that organizations with mature testing practices focus on risk-based testing rather than blanket coverage targets. They test what matters most, not everything equally.

When E2E Tests Are Worth the Cost

E2E tests are expensive to write, slow to run, and prone to flakiness. But they catch a class of bugs that nothing else can:

Cross-boundary bugs

When component A passes data to service B which writes to database C which triggers notification D β€” unit tests for each piece pass individually, but the chain fails because of a data format mismatch. Only an E2E test catches this.

Authentication and authorization flows

Login β†’ access protected resource β†’ token refresh β†’ session expiry. These flows involve cookies, headers, redirects, and timing. Mocking these in unit tests gives false confidence.

Payment and checkout flows

According to the Baymard Institute[4], the average cart abandonment rate across e-commerce sites is approximately 70%. Some of these abandonments are caused by broken checkout flows, expired sessions, or payment integration errors that only surface in E2E testing.

Critical user journeys

The paths where bugs cost real money: signup β†’ onboarding β†’ first purchase. These deserve E2E coverage even if they're expensive to maintain.

A Practical E2E Testing Strategy

Test the critical paths, not everything

Identify your top 5-10 user journeys by business impact. These get E2E coverage. Everything else gets unit and integration tests.

Critical paths (E2E):
β”œβ”€ User registration β†’ email verification β†’ first login
β”œβ”€ Product search β†’ add to cart β†’ checkout β†’ payment
β”œβ”€ Password reset flow
β”œβ”€ Admin creates user β†’ user receives invite β†’ user sets password
└─ Data export β†’ download β†’ verify file contents

Use realistic test data

Tests that use [email protected] and password123 miss bugs that real data reveals: unicode characters in names, long email addresses, special characters in passwords, addresses with apartment numbers.

Run E2E tests in CI, not just locally

A test that only runs on a developer's machine isn't a safety net β€” it's a suggestion. E2E tests should run on every pull request against a staging environment that mirrors production.

Accept some flakiness, but track it

E2E tests will occasionally fail due to timing issues, network latency, or environment quirks. Track flaky tests and fix the top offenders. A test suite that's ignored because it's too flaky is worse than no test suite at all.

The Real Cost of Skipping Tests

The System Sciences Institute at IBM reported[5] that the cost of fixing a bug found after product release is 4-5 times higher than one found during design, and up to 100 times more expensive than if found during the requirements phase. While the exact multiplier varies, the principle is consistent across research: bugs caught later are significantly more expensive to fix.

A study published by NIST[6] estimated that software bugs cost the U.S. economy approximately $59.5 billion annually (in 2002 dollars). The study concluded that more than a third of these costs could be eliminated through better testing infrastructure.

Testing isn't free. But it's significantly cheaper than production bugs.

What to Actually Do

For a new project:

  1. Set up a testing framework from day one (Vitest/Jest for unit, Playwright for E2E)
  2. Write unit tests for business logic as you build
  3. Add E2E tests for the 3-5 most critical user journeys before launch
  4. Run tests in CI on every pull request
  5. Don't chase coverage numbers β€” chase confidence in critical paths

For an existing project with no tests:

  1. Don't try to retroactively test everything β€” it's not worth the cost
  2. Add E2E tests for the top 5 user journeys first (biggest bang for the buck)
  3. Add unit tests for new code going forward
  4. When fixing bugs, write a test that reproduces the bug before fixing it
  5. Gradually increase coverage in high-risk areas

For a project with tests that nobody trusts:

  1. Delete tests that are permanently red or permanently skipped
  2. Fix or delete flaky tests β€” they erode trust in the entire suite
  3. Identify which tests actually catch bugs and protect those
  4. Rebuild confidence by starting with a green, reliable suite β€” even if it's smaller

The Bottom Line

Testing is about confidence, not coverage numbers. A focused test suite that covers critical paths and actually catches bugs is worth more than 95% coverage that gives false confidence.

Invest in the tests that protect your revenue and your users. Skip the tests that only make a dashboard look good.


Building software with quality built in? Request early access β†’

Testing E2E Test Coverage Quality Assurance DevOps
Lars Krueger

Lars Krueger

Founder & CEO

15+ years building enterprise Symfony applications. Founded Toolwiz to combine deep engineering expertise with AI-accelerated software delivery.

Ready to Accelerate Your Project?

Let’s discuss how AI-accelerated development can deliver your software faster.

Request Access