ProductHow it worksPricingBlogDocsLoginFind Your First Bug
A dark isometric scene in which Quara, a charcoal toy frog, rests one hand on a tipped stone balance scale: the raised pan holds a single small wrench while the sunken pan is crammed with gears and a toolbox, and a thin lime crack spreads through the workbench slab beneath the heavy side
TestingTest Automation StrategyManual Testing

When Not to Automate Testing: 4 Reasons to Skip It

Tom Piaggio
Tom PiaggioCo-Founder at Autonoma

When not to automate testing comes down to whether authoring plus ongoing maintenance costs more, over your planning horizon, than simply running the check by hand: low-churn one-off verifications, exploratory and usability judgment calls, specs still moving weekly, and flows guarded by third-party redirects, CAPTCHAs, or hardware you don't control. The decision is arithmetic, not instinct, and the term most automation pitches leave out of that arithmetic is maintenance.

Somewhere in your backlog is a ticket to automate a check that runs twice a year. Nobody added it out of malice. It got there because "automate everything" sounds like discipline, and admitting a test doesn't deserve automation feels like admitting you're not serious about quality.

That instinct has a cost, and it compounds quietly. Every hour spent scripting a check nobody will run again is an hour not spent hardening the regression suite that runs on every deploy. Most write-ups on manual vs automated testing treat that as a portfolio-level split. It's actually a per-check decision, and it's the smaller, less flattering question worth answering before you get anywhere near which tool to buy: should this specific check be automated at all.

Three gates, then the mathAny yes ends the decision earlyNew check candidateRuns infrequently?Needs human judgment?Spec still moving?Run the tipping-point ruleSkip automationverify by handAutomateSkip for nownononoyesyesyes

Three gates end the decision early. Only a check that clears all three reaches the arithmetic.

Four Signs a Check Doesn't Belong in Your Automation Suite

Not every check is a candidate. These four show up constantly, and each one is a reason to stop, not a reason to try harder.

The check that runs once, or twice, a year

Authoring cost gets paid up front and amortized against every future run. A check with one future run never amortizes anything. A retailer's holiday countdown banner ships in November and gets torn out in January; scripting it costs the same afternoon whether it runs once or five hundred times, and here it runs once. Instead: verify it by hand the one time it matters, and leave a note in a runbook for whoever owns it next year.

Exploratory and usability work

An automated check can only confirm an assertion someone already knew to write. It cannot tell you a checkout flow feels confusing to a first-time buyer, and it cannot discover the bug nobody predicted, because that requires forming a new expectation, not verifying an old one. James Bach and Michael Bolton's Exploratory Testing 3.0 defines exactly that loop: test design, execution, and result interpretation as mutually supportive activities happening at once, not separate phases you can hand off to a script. That's a job for a person with a hunch and thirty minutes in the running product, the kind of session exploratory testing is for. Instead: budget dedicated session time, and if that keeps losing to sprint pressure, that's a hiring gap, not a scripting one; see what an actual QA engineer is for.

A spec that's still moving weekly

Every automated check encodes an expectation. When the expectation itself changes every sprint, you're paying to rewrite the encoding faster than the product stabilizes. A new onboarding flow going through weekly redesign reviews isn't ready to be automated, no matter how good the tooling is; there is nothing stable yet to encode. Instead: verify each iteration by hand, and automate once the shape holds for two or three sprints in a row, not before.

The flow that costs more to stabilize than it saves

The genuinely hostile surface: third-party iframes you don't control, payment redirects, email or SMS round trips, CAPTCHA, time-dependent or seasonal state, hardware peripherals. A Stripe-hosted payment redirect that flakes on iframe load timing isn't a bug in your check, it's a boundary you don't own. Martin Fowler described exactly this class of test, one that drives through the UI end to end, as "brittle, expensive to write, and time consuming to run", and a third-party boundary is where that brittleness is worst and least fixable. If a check spends more engineer-hours being repaired than the manual run would have cost, it's a liability wearing a green badge. Instead: automate up to the handoff boundary, then verify the third-party leg by hand.

Four conditions disqualify a checkEverything else earns the calculationFour disqualifying conditionsEverything elseRuns oncea yearNeeds humanjudgmentSpec stillmovingThird-partyboundarySkip automation, verify by handEverythingelseRun thetipping-point rule

Four conditions disqualify a check outright. Everything else earns the calculation.

The Tipping-Point Rule: When the Math Says Automate

For everything that survives those four filters, here's the arithmetic version, simple enough to run before you file the ticket. Multiply runs_per_period by cost_per_manual_run, and compare that against authoring_cost plus maintenance_cost_per_period. Automate when the first number is bigger, over whatever horizon you're planning against: a quarter, a year, the realistic lifetime of the feature before it gets rebuilt. Skip it, or defer it, when the second number wins.

Every term has a definition that matters more than it looks like it should.

TermWhat it actually counts
runs_per_periodActual deploys or executions, not wished-for cadence
cost_per_manual_runMinutes per run: setup, data seeding, reporting
authoring_costOne-time engineer-hours to write and green the check
maintenance_cost_per_periodRepairs, flake triage, selector and framework churn

maintenance_cost_per_period is the term every vendor ROI calculator quietly drops, and it's usually the term that decides the answer.

Two flows, same team, same tooling, with illustrative numbers rather than measured ones. A checkout regression path runs on roughly 40 deploys a month, and a person verifying it by hand burns 15 minutes each time, call it 10 hours a month. Authoring the check costs a two-day sprint, settling into an hour or so of monthly maintenance once stable. The left side of the rule dwarfs the right inside the first month. Now take a one-off data-migration verification: it runs once, the manual check costs 20 minutes, and authoring it properly still costs a full day. The right side never gets paid back, because there's no second run to amortize it against. Same rule, opposite answer, and the only thing that changed is how many times the check actually fires.

Automation losesAutomation pays backAuthoring costOne-off check never paysTipping pointManual costAutomation costNumber of runsCumulative cost

Automation starts in debt from authoring cost. The crossover is where it stops being one.

What Automation Is Actually For

None of this argues against automation. It argues against automating the wrong candidate, and every workable software testing strategy starts from knowing which candidate you're looking at before committing engineering hours. The flows that clear the tipping-point rule easily share a shape: high churn, run on every deploy or every pull request, covering a spec that's already stable, and boring enough that a human running them badly is the actual risk. Login. Checkout. The core paths the app can't ship without. A cross-browser matrix nobody wants to click through five times by hand. These are where authoring cost gets paid back in weeks, not quarters, and where a person clicking the same fifteen steps for the two-hundredth time is a worse verifier than a script, not a more careful one.

How Autonoma Changes the Automate/Skip Line

Every criterion above assumed authoring_cost and maintenance_cost_per_period are fixed: a person's time to write assertions, and a person's time to fix them later. Lower either term enough and flows that used to sit firmly on the skip side of the line move to the other side, not because the flow changed, but because the cost of automating it did.

That's the honest way to describe what we built. Our Planner agent reads your codebase directly, generates the checks for the routes and flows that actually exist, and verifies behavior through the running application rather than a saved recording, which collapses most of authoring_cost. Our Diffs Agent runs on every pull request, updating, adding, or retiring checks against the code diff itself instead of waiting for someone to notice a check has gone stale, which is what maintenance_cost_per_period is actually made of underneath the spreadsheet line. Lower both terms of the right side of the inequality and the tipping point moves left: flows that didn't clear the bar at your old costs might clear it at these ones.

It does not erase the line, and an argument built on doing your own arithmetic shouldn't pretend otherwise. Exploratory and usability judgment is still a person's call; no agent asserts that a flow "felt confusing." A spec still changing weekly is still a moving target, cheaper authoring doesn't help if the thing you'd encode gets rewritten before it ships. A payment redirect through a third party you don't control is still a hostile surface regardless of who, or what, wrote the check pointed at it. Autonoma moves the boundary. It doesn't move the criteria that put a flow on the wrong side of it to begin with.

Three Ways This Rule Misleads You If You Apply It Once

The formula is honest, but it's easy to read it once and walk away with the wrong confidence.

Maintenance looks flat in a spreadsheet and isn't. It sits near zero for months, then a redesign or a framework major-version bump lands and every selector-based check breaks in the same week. Budget maintenance as a lump sum that arrives unpredictably, not a smooth monthly tax, or the rule looks more favorable than it actually is.

The horizon you pick changes the answer more than any other input. A check that pays back in eighteen months looks fine on paper and is a loss if the surface it tests gets rebuilt every six. Pick a horizon honestly tied to how long the feature is likely to look the way it looks today, not the horizon that makes the ticket easiest to approve.

There's a failure mode the formula doesn't even show: a flaky check has value below zero. It still costs its full maintenance_cost_per_period, and it does something worse, it teaches the team to stop trusting red. Once one check cries wolf often enough, engineers re-run the whole suite on failure instead of reading it, and every other check loses the credibility that made it worth writing. Google's own numbers make the scale of this concrete: in a 2016 analysis, about 84% of the pass-to-fail transitions the team observed involved a flaky test, which the post says "causes extra repetitive work to determine whether a new failure is a flaky result or a legitimate failure" and makes it "quite common to ignore legitimate failures" once that pattern sets in.

A flaky check doesn't sit at zero value. It sits below it, because it costs maintenance and it teaches the team to stop trusting every check next to it.
Stable check holds valueFlaky check loses valueZero valueCosts more than it catchesTimeValue of a checkOne flaky checkNeighbouring checks losecredibility too

A stable check holds its value. A flaky one goes negative and takes its neighbours' credibility with it.

Decide the Question in This Order

Skip-or-automate comes first, tool selection comes second, and running them in the other order is how teams end up buying a platform to babysit checks that never should have existed. Once a flow clears the tipping-point rule, the next question is which tool earns back that authoring and maintenance cost fastest, and that's a separate decision with its own criteria: how a tool handles the maintenance term, how it fits your stack, what it costs at your real run volume, not the volume in the sales deck. How to choose a test automation tool picks up exactly there.

If the arithmetic says automate, and the flow is behavioral, something a user does through the running UI, not an API contract or a unit of business logic, that's the point to check what dropping it into Autonoma instead of a blank test file would cost to author and maintain over the same horizon. That comparison, run with your own numbers, is the fair test of whether any tool is worth adopting, weighed over the same horizon for every major tool shape, not just ours.

Frequently Asked Questions

Run the tipping-point rule. Multiply how many times the check actually executes per period by the manual cost of running it, and compare that against the one-time authoring cost plus the recurring maintenance cost. If the first number is bigger over a horizon you can defend, automate it. If maintenance or a low run count wins, it isn't worth automating yet, or maybe ever.

Judgment work is the clearest case: usability impressions, exploratory sessions, and anything that requires noticing something nobody thought to assert in advance. An automated check can only confirm a known expectation, so it structurally cannot do this kind of testing, no matter how the tooling improves.

Often, yes. A flaky check still costs its full maintenance burden, and it teaches the team to stop trusting failures, which erodes confidence in every other check in the suite. A missing test is a known gap. A flaky test is a gap plus a credibility problem, which makes it a liability with a green badge rather than a neutral absence.

Autonoma is built to make more of your checks worth automating. It attacks the two costs the tipping-point rule turns on: our Planner agent generates behavioral tests directly from your codebase, and our Diffs Agent updates them against every pull request, so authoring and maintenance stop dominating the math. Flows that didn't clear the bar at hand-written costs often clear it at these ones. You still run the rule with your own numbers and make the final call, which is the fastest way to see how many more flows now pay off, so point Autonoma at one you were on the fence about and let the lower cost settle it.

Whenever one of the four disqualifying conditions changes: a spec that was moving weekly settles down, a once-a-year check turns into a quarterly one, or a flow that used to touch a hostile third-party boundary gets redesigned to avoid it. The decision isn't permanent. It's a snapshot of the current run frequency, cost, and stability, and any of those three can shift the answer.

Related articles

A decision path splitting test flows by oracle type into automate, keep manual, and not-yet-settled, with a stacked cost chart showing the maintenance term dominating over a 24-month horizon

Test Automation Strategy: What Should You Actually Automate?

A test automation strategy decides what to automate by the cost of keeping a test true, not by repetition. Here is the arithmetic most ROI calculators skip.

A horizontal agent trajectory diagram showing a tool call passing a right-tool checkpoint but failing an argument-accuracy checkpoint

How to Test AI Agents That Take Actions (Tool Calls)

A runnable guide to testing tool-calling agents: right tool, right order, right arguments, mocked vs live calls, failure handling, and non-determinism.

A chatbot test pipeline moving from manual QA through scripted and semantic assertions into an automated CI gate that samples the model N times before allowing a merge

Chatbot Automation Testing: Why Assertions Fail

Chatbot automation testing that survives non-deterministic replies: the migration to a CI gate, n-run sampling, threshold gating, and real GitHub Actions YAML.

Sealed tenant data capsules being sorted into fully partitioned vault compartments, each isolated from the others, illustrating multi-tenant test data isolation

Multi-Tenant Test Data Isolation

What multi-tenant test data isolation means, why it matters for testing, and the four isolation patterns (schema, row-level, database, per-run) with tradeoffs.