I used to treat testing like a fitness tracker: if the number went up, I felt like I was doing the right thing. “We hit 85%!” sounded like progress, even when nobody could explain what that 85% actually protected.
Now I think about testing the way I think about on-call: it’s not about how much you touched—it’s about how well you can sleep after you deploy.
Testing is confidence. It’s the feeling that when you change something on Tuesday at 4:57pm, you’re not secretly pulling a loose thread that unravels production at 2:13am.
The uncomfortable truth is that “more tests” doesn’t automatically mean “more confidence.” Sometimes it means more noise. More brittle assertions. More snapshots that fail because someone added a comma. More time spent babysitting test suites instead of shipping or learning.
Confidence comes from choosing the right things to test, and choosing them consistently.
The stuff worth testing is usually the stuff you least want to touch
There’s a pattern I’ve seen across React frontends, Node backends, and cloud glue code: the highest-value tests sit right next to the highest-anxiety parts of the system.
Not because those parts are inherently evil. But because they’re:
- Hard to reason about (async flows, caching, concurrency, retries)
- Easy to break (fiddly business rules, edge cases, time zones—yes, always time zones)
- Expensive to fix later (payment logic, auth, migrations, anything that triggers a customer email)
In other words: the places where humans are most likely to be confidently wrong.
So I stopped asking “What can we cover?” and started asking “Where do surprises come from?”
That one shift made testing feel less like a chore and more like risk management.
The “best” test suite is the one your team actually runs
An exhaustive test suite that nobody trusts is basically a museum exhibit. Technically impressive. Quiet. Untouched. Occasionally referenced in arguments.
A smaller test suite that’s reliable is a tool. People use it. People believe it. People let it shape how they work.
And reliability isn’t just “tests pass.” It’s:
- Tests fail for real reasons
- Failures are actionable
- A failing test doesn’t require a séance to interpret
- Runtime is short enough that people don’t go make coffee and forget they started it
Consistency beats perfection because consistency compounds. If the team trusts the suite, they run it more. If they run it more, they catch issues earlier. If they catch issues earlier, fixes are cheaper and calmer. Calm is underrated engineering infrastructure.
Where this goes sideways in production
The classic failure mode is chasing coverage while missing risk.
You end up with a bunch of tests that verify things that are already obvious:
- “renders a button”
- “calls handler on click”
- “returns 200 for the happy path”
Meanwhile, the actual production incident comes from the place you didn’t test because it was “too hard” or “we’ll get to it later”:
- A retry loop that doubles charges
- A cache key that doesn’t include locale
- An auth middleware change that blocks an internal service
- A React state refactor that breaks a “rare” flow that happens 5,000 times a day
Coverage told you the code was “tested.” Reality told you the system wasn’t understood.
That’s why confidence is a better goal than coverage. Confidence forces you to decide what matters.
A smaller, sharper approach
If you want a practical heuristic, test around volatility and blast radius.
Volatility: what changes often?
Those areas are constantly at risk of regression, even with smart engineers and good intentions.
Blast radius: what breaks in the worst way when it goes wrong?
Money. Identity. Permissions. Data integrity. Anything that creates a support ticket avalanche.
This is where different kinds of tests earn their keep:
- Unit tests for business rules that have lots of branches (pricing, eligibility, parsing, transforms)
- Integration tests for contracts between components/services (API shapes, DB queries, queues, auth boundaries)
- End-to-end tests sparingly, for the critical “money paths” and “can’t log in” flows
End-to-end tests are like calling in the ThunderCats: powerful, dramatic, and absolutely not something you want to do for every minor inconvenience. Use them where they matter, because maintaining them is a real cost.
The trade you’re actually making
When you choose what to test, you’re trading one kind of cost for another:
- Write more tests now → slower today, fewer surprises later
- Write fewer tests now → faster today, riskier later
But there’s a second trade most teams forget:
- Test too much at the wrong level → brittle suite, constant maintenance, people stop trusting it
- Test too little at the right level → calm suite, but surprise bills show up in production
The goal isn’t maximum safety. The goal is predictable safety.
Or, put differently: you’re not building a fortress. You’re building a smoke alarm that doesn’t chirp every time someone makes toast.
If you try this next week
A simple checklist I’ve used with teams that want to level up their testing without turning it into a second job:
- Identify the top 5 “surprise generators” in the system (based on incidents, bug reports, or “areas we fear”)
- Add or strengthen tests around one of those areas per sprint
- Prefer tests that validate contracts and invariants over implementation details
- Make failures obvious: good names, clear assertions, minimal mocking
- Track “flaky test rate” like it’s a production metric, because it’s a trust metric
- Keep the suite fast enough that it stays in the inner loop
If you do only one thing: stop celebrating coverage and start celebrating “we caught a nasty surprise before prod.”
That’s the habit that changes engineering culture.
Testing isn’t about proving code works. It’s about reducing the number of times your system teaches you humility in front of customers. (It will teach you anyway—this is software—but you can reduce the syllabus.)
If you’re dealing with a test suite that’s either exploding in size or quietly ignored, I’m happy to take a look. Send me your stack, team size, what’s painful, and your timeline.
Want to talk this through?
If you’re dealing with messy React boundaries, TypeScript drift, or a deployment pipeline that hates you back, let’s chat.
- Book time on my calendar
- Or email: marc@klecticmedia.com



Leave a Reply