The Test Pyramid Debate: Why the Right Shape Isn't a Shape at All
The pyramid, the trophy, the honeycomb: every testing shape has defenders. Here's why the right ratio comes from your own defects, not a diagram.

A release gets held on a Thursday because the end to end suite failed overnight, and nobody can say in ten minutes whether that's a real bug or a flaky selector. Someone on the team mutters that "we have too many end to end tests" and someone else says "no, we don't have enough unit tests." Both are quoting a diagram they half remember from a conference talk years ago. This post is for the team having that argument, and it tries to settle it without picking a side in the diagram war.
What the test pyramid actually said
Mike Cohn's test pyramid, from his 2009 book, made a simple claim: write lots of fast unit tests, fewer integration tests, and a small number of slow end to end tests, because that shape keeps your suite fast and cheap to maintain. In 2009 this was excellent advice. Spinning up a browser to click through a checkout flow was slow and brittle. Unit tests ran in milliseconds. The economics genuinely favored pushing coverage down the stack.
The pyramid also matched how most teams actually built software then: a backend with clear function boundaries, a thin UI layer, and not much distributed complexity to worry about. If your bugs mostly lived in business logic, a pyramid shaped suite caught them where they were cheapest to catch.
The case against it, stated fairly
The strongest criticism isn't that the pyramid was wrong. It's that the assumptions it rests on have shifted for a lot of teams.
- Cost assumptions changed. Headless browsers, parallel CI runners, and tools like Playwright and Cypress made end to end tests dramatically faster and more stable than they were in 2009. A 15 minute browser suite today would have taken hours back then.
- The pyramid optimizes for suite speed, not for confidence that the product works. A thousand fast unit tests can all pass while the actual user flow is broken, because unit tests mock away the exact integration points where real bugs hide.
- Modern systems are less like one backend with clean seams and more like several services talking over a network. A pyramid built for one codebase doesn't map cleanly onto a system where the interesting bugs happen between services, not inside one function.
Kent C. Dodds made a version of this argument popular when he proposed the testing trophy: fewer unit tests, more integration tests, and end to end tests kept as a thin top layer for the flows that matter most. His point was that integration tests, which check that several units work together the way users actually experience them, tend to catch more real bugs per test written.
The alternatives, briefly, without picking a favorite
Once the pyramid became a target, several other shapes showed up to replace it. None of them deserves the same unconditional trust the pyramid once got.
- The testing trophy, weighted toward integration tests, with unit tests and end to end tests as smaller layers above and below.
- The testing honeycomb, a variant aimed at service oriented systems, which pushes weight toward integration tests between services rather than within one.
- The testing diamond, similar in spirit to the trophy, popular in some API heavy backend teams.
Each of these is a reasonable shape for the team that proposed it, because it matches that team's architecture and defect history. None of them is a universal replacement for the pyramid, because none of them was derived from your codebase.
The actual resolution: let your defects draw the shape
Here's the argument neither the pyramid post nor the anti pyramid post reaches. The right shape for your suite isn't a pyramid, a trophy, or a diamond, chosen because it sounds current. It's whatever shape your own escaped defect history implies.
The method is not complicated:
- Pull your last 20 to 30 production incidents or customer reported bugs, going back a quarter or two.
- For each one, ask where it should have been caught: could a unit test have found it, did it need two components running together, or did it only show up with a real browser and a real network call?
- Tally the results. If 60 percent of your escaped bugs needed two services talking to each other, your suite is under invested in integration tests, whatever the diagram says.
- Revisit this every quarter or two, because your architecture and your defect pattern both drift.
A team shipping a monolithic CRUD app with well tested business logic will probably see most of its escaped bugs traced back to UI regressions, like the Safari only checkout bug that reached a customer last spring because nobody ran the flow outside Chrome. A team built on five microservices will more often trace bugs to the handoff between two of them, like an order service accepting a payload that the shipping service silently rejects. These two teams should not run the same shaped suite, and no diagram written in the abstract can tell them which one to run.
This is also why the ratio question is the wrong question to answer definitively. Anyone telling you the correct split is 70 percent unit, 20 percent integration, 10 percent end to end is answering for a team they've never met. The number that matters is derived from your own history, not adopted from someone else's.
Keeping the record so the method actually works
The hard part of this method isn't the analysis, it's remembering to do it. Escaped defects tend to get triaged, fixed, and forgotten before anyone asks the more useful question: what test would have caught this, and why didn't we have it. Keeping documented test cases connected to the defects they were written in response to makes the quarterly review much faster, because the pattern is visible in your own records instead of buried in old incident channels.
If you're deciding what to automate first rather than how to shape the whole suite, that's a related but separate decision, and it's worth reading alongside this one rather than instead of it. The same defect history that shapes your pyramid also tells you which manual checks are worth automating first.
The takeaway for the team arguing on a Thursday
Nobody in that argument was fully wrong. The pyramid was good advice for 2009's costs and architectures. The trophy and the honeycomb are good advice for teams whose bugs cluster where those shapes expect them to. The mistake is treating any of them as a universal law rather than a hypothesis to check against your own data.
Questions people ask
Is the test pyramid outdated?
Not entirely. Its cost assumptions have shifted for many teams, but the underlying idea, that fast tests should outnumber slow ones, still holds for a lot of systems.
Should I switch to the testing trophy instead?
Only if your escaped defect history shows integration level bugs slipping through. The trophy fits some teams well and others badly, the same as the pyramid does.
What's the fastest way to find my team's right ratio?
Review your last 20 to 30 escaped bugs and classify where each one should have been caught. The pattern usually becomes obvious within an hour.
Does this mean ratios don't matter at all?
Ratios matter, but the specific numbers should come from your defect data, not from a blog post, including this one.
How often should we redo this analysis?
Every quarter or two is enough for most teams, or sooner after a major architecture change like splitting a monolith into services.
Try Tesbo, or get the next useful idea
Start building your testing workflow now, or get one practical email a month.
Get startedOne email a month
What we shipped, what we learned, and the occasional infographic worth pinning. Unsubscribe in one click.


