QA and Test Strategy Consulting
A test suite people trust and run. Coverage placed where failure is expensive rather than spread evenly, and flakiness treated as a defect rather than as weather.
- Who
- Delivered by a senior team assembled for the engagement, against a defined scope.
What you're seeing
- A red build gets re-run before anyone looks at it.
- Usually means The suite has stopped gating anything. Every test still costs time to run and maintain, and none of them is preventing anything — this is the worst possible state, worse than having no tests.
- Coverage is high and bugs still reach production.
- Usually means Coverage was pursued as a number, so tests accumulated where they were cheap to write rather than where failure is expensive. The percentage is real and it is measuring the wrong thing.
- The end-to-end suite takes forty minutes and half of it is testing form validation.
- Usually means The pyramid is inverted — things testable in milliseconds underneath the interface are being tested through a browser. It is slow, brittle, and the brittleness is what teaches people to re-run.
- Nobody can say what the suite is supposed to guarantee.
- Usually means There is no written strategy, so what gets tested is decided per pull request by whoever is writing it. That produces uneven depth with no relationship to risk.
A suite nobody trusts is worse than none
Once a red build is routinely re-run before anyone reads it, the suite has stopped gating anything.
The cost has not gone anywhere. It still takes minutes on every push, engineers still maintain it, and it still blocks merges — it just does not prevent anything. That state is strictly worse than having no tests, because at least a team with no tests knows what it does not have.
Getting out of it is not primarily about writing more tests. It is about making every remaining failure meaningful, which usually means deleting some, quarantining the unreliable ones on a deadline, and moving assertions down out of the browser.
Coverage follows risk
Authorisation, money movement and data integrity get depth. A settings page that renders a form does not need the same treatment.
That sentence is the whole strategy, and the reason it needs writing down is that a coverage percentage says the opposite. A percentage is indifferent to what the code does — it rewards whatever is cheapest to reach, and the cheapest code to test is almost never the code whose failure ends up in a customer’s invoice.
The written strategy names both halves: what must not break, and what is deliberately uncovered. The second half is the part that makes it a decision rather than an aspiration, and it is the part a number cannot express.
Fast enough to block on
A suite that is too slow to gate a merge is a suite that runs after the decision it was supposed to inform.
So there is a runtime budget, enforced in CI like any other budget. Keeping inside it is what forces the pyramid to stay the right way up: most assertions at unit level where they cost milliseconds, a thin end-to-end layer over the flows that carry revenue, and integration coverage in between for the seams that genuinely need a running dependency.
Where it sits
This is a capability inside Software Development, where the strategy is written alongside the build rather than after it, and inside Platform Engineering, where the suite is one of the gates in the path to production.
It pairs with two others directly. Release & Deployment Verification covers what is checked after a deploy rather than before it — the two together decide what “safe to ship” actually means. And CI/CD Pipeline is where the runtime budget is enforced, because a strategy with no gate behind it is a document.
How the work runs
-
Place coverage by risk
Money paths, data integrity and authorisation get depth. Everything else gets enough. Uniform coverage targets produce tests where they are cheap rather than where they matter.
-
Fix the pyramid
Most assertions at unit level, a thin end-to-end layer over the flows that carry revenue. Inverted suites are slow, brittle, and eventually ignored.
-
Kill flakiness
Flaky tests quarantined and fixed on a clock. One unreliable test teaches the team to re-run red builds, which removes the value of every other test.
-
Put it in the gate
The suite wired into CI as a merge condition, with a runtime budget so it stays fast enough to actually block on.
What arrives
- A written test strategy naming what is covered and what deliberately is not
- A stable end-to-end suite over the critical flows
- A flaky-test policy with quarantine and a repair deadline
- CI gating with an enforced runtime budget
What it costs your team
Around three hours a week from a lead engineer, mostly reviewing what gets covered.
How we decide
Coverage is placed by risk, and no percentage target is set
Costs It removes the single number executives and tooling both like to track.
A coverage percentage rewards testing whatever is cheapest to test, which is rarely where the money is. Authorisation, payment and data integrity get depth; a settings page that renders a form gets enough. The written strategy names what is deliberately not covered, which is the part a percentage can never express.
Flaky tests are quarantined and repaired on a clock, never tolerated
Costs Quarantining removes real coverage temporarily, and the repair deadline creates work nobody planned for.
One unreliable test teaches the team that red builds are re-run rather than investigated. That habit transfers instantly to every other test in the suite, including the ones that were about to catch something. Flakiness is not weather, it is a defect, and it is the defect with the largest blast radius.
The end-to-end layer stays thin, deliberately
Costs It leaves some integration paths covered only indirectly, which feels risky when writing the strategy.
End-to-end tests are the slowest and least stable form of coverage available. A thin layer over the flows that carry revenue is fast enough to gate a merge and stable enough to be believed. A thick one is neither, and a suite nobody believes is not coverage — it is a queue.
Where this has run
Frequently Asked Questions
Sources
- Martin Fowler — The Practical Test Pyramidmartinfowler.com
- Martin Fowler — Continuous Integrationmartinfowler.com
- Microsoft — Code With Engineering Playbookmicrosoft.github.io
- Principles of Chaos Engineeringprinciplesofchaos.org
Page reviewed

