Sample Report · Test Automation

Test Automation Health Report — Sample

A worked example of auditing a test suite rather than the software — what the suite actually catches, the cost of the tests nobody trusts, and the quarter of it that could be deleted with no loss.

Markdown. No sign-up, no email.

This is an illustrative example. The suite and figures are invented. The subject is the one most teams never review: not whether the software is good, but whether the tests are.


Test automation health — Q3 2026#

Suite2,840 automated tests across unit, integration, end-to-end and AI behaviour
Runtime41 minutes on the pipeline
Period reviewedApril – July 2026
MethodTest run history, defect records, coverage against changed code

1. The measure that matters#

Not coverage. Of the defects that reached production, how many could a test have caught?

DefectsShare
Reached production34
A test existed and passed anyway618%
No test existed for this behaviour2162%
Not testable at this level720%

Sixty-two per cent of production defects had no test. Coverage stands at 78%, and the two numbers do not contradict each other: coverage measures which lines ran, not which behaviours were asserted.

The 6 defects where a test existed and passed are the more serious category. Three had assertions so loose they could not fail; two asserted on a mock that no longer resembled the real service; one asserted the code's behaviour rather than the requirement, so it was updated alongside the bug.

2. Where the runtime goes#

LayerTestsRuntimeDefects caught
Unit2,1903 min41
Integration4609 min78
End-to-end12022 min19
AI behaviour707 min24

End-to-end is 54% of runtime and catches 12% of defects. It is also where every flaky test lives. Integration is the best value in the suite by a wide margin and is the smallest layer after AI behaviour.

3. Flaky tests, and what they cost#

Tests that failed then passed on re-run, no code change47
Share of the suite1.7%
Pipeline runs affected in the period31%
Engineer time spent re-running and investigating~26 hours

Roughly one pipeline run in three was affected by a test that was not testing anything stable. The real cost is not the 26 hours; it is that "re-run it" has become the reflex.

That reflex is expensive. Two of the six production defects in section 1 were caught by a test that failed legitimately, was assumed flaky, and was re-run until it passed. A suite with flaky tests does not merely waste time — it trains people to ignore failures.

Investigating all 47:

CountAction
Timing assumption — waits for a fixed duration19Wait for the condition
Shared state between tests11Isolate
Dependence on real external services8Contract test instead
Non-deterministic AI output, single run6Repeat and threshold
Genuinely intermittent product defect3Fixed — they were real

4. The quarter that can be deleted#

TestsReason
Assert on implementation, not behaviour310Fail on every refactor, catch nothing
Duplicate coverage of the same path240Same assertion at three layers
Test framework behaviour, not our code95Left from a template
Permanently skipped, over 6 months61Nobody remembers why
Total706 (25%)

Deleting them removes roughly 9 minutes of runtime and no coverage of any behaviour. The 310 implementation-coupled tests are worse than neutral: they are the reason two refactors were abandoned this quarter, having been scoped without accounting for the test rewrite.

5. The AI behaviour layer#

Newest layer, best value per test in the suite: 70 tests, 24 defects caught.

Cases run per pipeline execution70 × 3 repetitions
Cost per full run$1.90
Model version pinnedYes
Catches that no other layer could24

Its problem is coverage, not quality. Seventy cases across eleven AI features means several features have three cases, and 9 of the 21 untested production defects were in AI features.

6. Recommendations#

  1. Delete the 706 tests. No behaviour loses coverage; 9 minutes and a recurring refactor tax go away.
  2. Fix all 47 flaky tests or delete them. Not next quarter. The reflex they create is what let two real defects through.
  3. Move end-to-end coverage down a layer. Keep about 30 true journeys; convert the rest to integration. Most of the 22 minutes and most of the flakiness are here.
  4. Triple the AI behaviour layer, prioritising the features behind the 9 untested defects. Best return available at roughly $6 a run.
  5. Report "defects a test could have caught" every quarter. It is the only number in this report that describes whether the suite is working.
  6. Stop reporting coverage as a target. It is 78% and it did not predict any of this.

7. Projected#

NowAfter
Tests2,8402,340
Runtime41 min24 min
Flaky470
Pipeline runs affected by flakiness31%
AI behaviour cases70210
Cost per run$1.90$6.10

Notes on using this format#

Audit the suite, not the software. Nobody owns test quality by default, and a suite decays in ways that make it slower and less useful at the same time.

Count defects a test could have caught. Coverage was 78% while 62% of production defects had no test. One number describes the suite; the other describes what it does.

Treat flakiness as a correctness problem. Three of 47 flaky tests were real intermittent defects, and two production escapes came from a legitimate failure dismissed as noise.

Deleting tests is a legitimate result. A quarter of this suite cost time, blocked refactoring, and asserted nothing about behaviour.

Back to Test Automation