ProductHow it worksPricingBlogDocsLoginFind Your First Bug
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
TestingTest Automation StrategyTest Automation Cost Benefit Analysis

Test Automation Strategy: What Should You Actually Automate?

Tom Piaggio
Tom PiaggioCo-Founder at Autonoma

A test automation strategy decides which flows get automated, on what rule, and who pays to keep each test true as the product changes. The rule that holds up: automate where the expected behavior is stable and machine-checkable, keep manual review where the oracle is human judgment, and price in maintenance and false-failure cost before authoring cost, because those are the terms that actually compound.

Somebody upstream asked you for a test automation strategy document: a VP tracking suite scale past Series B, an auditor, or your own manager after a release shipped with a bug a test should have caught. You went looking, and the advice reads the same everywhere: automate what's repetitive, stable, and high-volume. That advice isn't wrong exactly. It's answering a question your team stopped asking a while ago.

This is written for QA leads, QA managers, and engineering managers who own quality without a dedicated QA function, running a real suite at a Series A through Series C company with a real release cadence. It isn't for a pre-seed team deciding whether to write its first test, and it isn't about whether an AI-generated test can be trusted to run unsupervised. Those are different problems with their own answers. Yours is narrower: you already automate things. The document has to say, defensibly, which things and why.

Why most software test automation strategy templates use the wrong rule

Pick up almost any software test automation strategy template and the criteria read the same: automate what repeats, automate what's stable, automate what runs at volume. The logic was sound, once. All three are a proxy for one variable: hours to author and hours to run. When a human had to hand-write every selector, walk every click path, and hard-code every assertion, authoring time decided whether automating a flow was worth it. A flow that changed every sprint was a bad bet: you'd rewrite the script before it paid for itself. A flow that ran once a quarter was just as bad: the cost would never amortize. Repetitive, stable, high-volume wasn't folk wisdom. It was correct capital budgeting for an era where writing a test consumed real, scarce engineer-hours.

That era is ending for a meaningful share of test cases. Authoring cost is drifting toward the cost of specifying behavior rather than scripting it by hand, and cheap authoring inverts the calculus the old rule was built on; that argument gets its own treatment elsewhere. What matters here is narrower: a rule built around authoring cost optimizes for a resource you're no longer short on. The resource a test strategy actually allocates has shifted. It used to be the time to write tests. Now it's the attention to review what an automated system produced. A rule that never mentions the second resource keeps giving you an answer that keeps being less useful.

What should you automate? Sort by oracle type, not by repetition

The rule that replaces repetitive-and-stable-and-high-volume doesn't care how often a flow runs. It asks one question: what kind of oracle decides pass or fail? Automate where something other than a person can check the outcome. Keep it manual where a person has to be the judge. Here's how that rule sorts six flows teams get wrong in both directions, on its own:

Flow characteristicOracle typeAutomate?Why
Checkout total arithmeticDeterministic, machine-checkableYesTotal is a computable fact
Password reset email deliveryMachine-checkableYesDelivery and link validity are binary
Onboarding illustration feels on-brandHuman aesthetic judgmentNo"On-brand" has no computable definition
Error message reads kindly enoughHuman judgmentNoKindness is read by a person
Pricing page redesigned weeklyOracle not yet settledNot yetSpec is still being argued about
CSV export column orderDeterministic, machine-checkableYesBoring, low glamour, breaks billing

Decision path splitting a flow under review by oracle type: deterministic and machine-checkable leads to automate, human judgment leads to keep manual, and an unsettled oracle leads to not yet, revisit

One branch point decides the rule: whatever adjudicates pass or fail. A machine-checkable oracle earns automation, a human oracle stays manual, and an unsettled one waits.

Notice what the rule ignores: how often the flow runs, how tedious it is to click through, how long the test has existed. It asks only whether a machine can adjudicate the outcome without a person in the loop. Whether a flow earns a test at all is a separate, earlier question; risk-based prioritization is where that selection happens, upstream of this rule. If you're comparing manual coverage with automated suites, this is the filter each candidate runs through before it joins the queue, not after.

Test automation cost benefit analysis: the term everyone drops

The rule tells you the direction, not the size of the bet, and that's where strategy documents fall apart under scrutiny. What follows is a worked model, essentially a test automation cost benefit analysis with every input explicit and illustrative, not measured from a real team. Substitute your own rate, cadence, and flakiness; the shape holds even as totals change.

Four terms make up the real cost, and the standard pitch prices only two of them.

Authoring cost is hours to write the test x loaded hourly rate. This term is collapsing toward zero for a growing share of cases, exactly why the old rule broke.

Run cost is runs per month x minutes per run x compute rate. Usually the smallest term in the model, small enough to barely move the total.

Maintenance cost is UI changes touching the flow per month x tests broken per change x hours to diagnose and repair x loaded rate. This is the term that compounds, because it recurs every month, tied to release velocity rather than to anything about the test itself.

Cost of a false failure is false failures per month x (engineer minutes burned triaging + the cost of the suite losing credibility). The first half prices in engineer-hours. The second resists a clean number: once a team starts ignoring red builds because they're usually noise, real failures slip through with them, and that erosion never shows up on an invoice. It still belongs: it's how a maintenance problem quietly becomes a trust problem.

Run a 24-month horizon on a 100-test suite with round, obviously hypothetical inputs: 3 hours to author each test at a $75 loaded hourly rate, 20 runs per month at 2 minutes per run and $0.05 per compute-minute, 10 UI changes per month touching the automated flows with 2 tests broken per change and 1.5 hours to diagnose and repair each break, and 4 false failures per month at 30 minutes of triage each. Authoring is a one-time cost paid at month zero; the other three accrue every month after.

MonthAuthoring (cumulative)Run (cumulative)Maintenance (cumulative)False failure (cumulative)
0$22,500$0$0$0
6$22,500$1,200$13,500$900
12$22,500$2,400$27,000$1,800
18$22,500$3,600$40,500$2,700
24$22,500$4,800$54,000$3,600

Stacked bar chart of cumulative cost at months 0, 6, 12, 18 and 24, with a flat authoring base of 22,500 dollars and a maintenance segment growing to 54,000 dollars by month 24 while run and false-failure costs stay thin

The table above, drawn to scale. Authoring is a flat $22,500 paid once, while maintenance accrues $2,250 a month to $54,000 by month 24, roughly two-thirds of the $84,900 total.

Do the arithmetic: the crossover lands just past month nine, where maintenance plus false-failure cost ($2,400 combined per month) overtakes the one-time $22,500 authoring cost, before the suite turns a year old. By month 24, those two terms total $57,600, more than double the build cost, and maintenance alone accounts for roughly two-thirds of the entire bill.

This is the term vendor ROI calculators reliably drop. Most price authoring and run cost off a rate card and omit maintenance and false-failure cost, because both depend on your product's rate of change, not the tool. That's less dishonesty than modeling shortcut, but it's why the calculator looks better than what a team experiences a year in. For the maintenance number alone, the maintenance cost model runs it in isolation; for the fuller manual-versus-automated comparison with AI-assisted authoring folded in, that cost model runs the full comparison.

How Autonoma changes the maintenance term

The model above has a structural weakness built into it: maintenance cost is a function of how many hours a human spends diagnosing and repairing a broken test every time the UI changes, and that number doesn't fall on its own. It falls only if something other than a human handles the diagnosis and repair, which is the actual lever, not a faster human process.

We built Autonoma's testing layer around that lever specifically. Our Planner agent reads your codebase, not recordings of someone clicking through the app, so tests are derived from the routes, components, and flows that actually exist in the code, and it also generates the endpoints needed to put your database in the right state for each test case. The Diffs Agent is the piece that changes the maintenance term directly: it runs on every PR, reads the code diff, and adds, deprecates, or updates test cases to match what the diff actually changed, running those tests against a live preview environment as part of the same pass. The hours-to-diagnose-and-repair factor in the maintenance formula, the one that scales with your release cadence and compounds every month in the model above, is the factor this replaces. It doesn't reduce how often your UI changes. It removes the human labor that used to sit between a UI change and a passing suite.

That's the honest scope, and it's worth being precise about where it ends. Autonoma is a behavioral end-to-end testing layer, not a load or performance testing tool, not an accessibility auditor, not an API contract testing framework, and not a native mobile E2E runner. A test automation strategy that recommended one tool for all of those categories would get flagged by the first engineer who read it, and an article that implied the same thing would deserve the same treatment. For the flows in the "automate" column of the table above, where a machine-checkable oracle already exists, this is what changes: the flow gets a test, and the test's maintenance cost stops compounding with every release.

Both directions of the mistake

Teams running a real suite at a real release cadence, the audience this document is for rather than a pre-seed team writing its first test, tend to get the rule wrong in two directions, and both mistakes are visible from the outside once you know to look.

The first is automating a flow whose expected behavior is still being argued about internally. The pricing page redesigned weekly from the table above is the clean example: if product and design haven't settled what the page should do, a test locks in this week's answer as ground truth, and every redesign either breaks the test or, worse, the test keeps passing against a version of the page nobody wanted anymore. You end up paying the maintenance cost from the model above every single sprint, on a spec that never stabilized long enough to be worth automating in the first place. The fix isn't "don't test the pricing page." It's "wait until the oracle settles," which for a flow like this might be weeks, not never.

The second mistake runs the other way: refusing to automate a flow because it's boring. CSV export column order is not a flow anyone brags about testing. It's also exactly the kind of flow that breaks a downstream billing integration silently, with a support ticket as the first signal instead of a failed test. Low glamour and high blast radius aren't in tension, they're a specific and common combination, and it's precisely the combination a machine oracle handles well: the correct column order is a computable fact, checking it takes no human judgment, and the cost of getting it wrong in production is exactly the kind of failure a good automation rule exists to catch before it reaches a customer. Once a flow like this clears the bar, folding it into a regression suite that runs on every PR is the mechanical next step, not a separate decision.

Neither mistake is really about automation skill. Both come from applying the old rule (repetitive, stable, high-volume) to a flow it was never built to evaluate, because the old rule never asked what kind of oracle decides pass or fail. Replace it with the oracle-based rule, price the four terms honestly with your own inputs, and the test automation strategy you were asked to write stops being a list of exceptions and starts being a rule someone else can apply to the next flow without asking you first.

If you want the broader shape of a strategy document before narrowing to the automation criteria, the seven named testing approaches are where most teams start that conversation. And if the maintenance term in your own model is the one keeping the automation backlog stuck, that's the specific problem Autonoma was built to take off a team's plate: fewer hours spent diagnosing why a passing suite broke overnight, and more of the reviewing attention that's now the actually scarce resource going toward deciding whether the suite is testing the right things at all.

Frequently Asked Questions

At minimum: a stated rule for what gets automated, ideally based on oracle type rather than repetition, the cost model behind that rule including authoring, run, maintenance, and false-failure cost, and a description of who owns keeping the suite aligned as the product changes. A strategy that only lists tools or coverage targets without the decision rule and its cost model is a shopping list, not a strategy.

Flows where the pass or fail judgment depends on human taste rather than a computable fact, such as whether an illustration feels on-brand or an error message reads kindly, and flows whose expected behavior is still being actively redesigned. Automating either locks in a moving target and pays maintenance cost every sprint for a test that can't stay true.

Add up four terms rather than two: authoring cost (hours to write times loaded rate), run cost (runs per month times minutes per run times compute rate), maintenance cost (UI changes per month times tests broken per change times hours to repair times loaded rate), and the cost of false failures (triage minutes plus the harder-to-price cost of eroded trust in the suite). Most vendor ROI calculators model only the first two, which is why their output tends to look better than lived experience.

It depends on release velocity and how many tests break per UI change, but the formula is UI changes per month times tests broken per change times hours to diagnose and repair times loaded hourly rate, and it recurs every month rather than amortizing like a one-time build cost. In a worked model of a 100-test suite over 24 months, maintenance alone accounts for roughly two-thirds of the total cost. Autonoma's dedicated model for that number breaks the maintenance term out in isolation, with each input priced separately.

Yes, and it changes what the document should say. Cheap authoring shifts the scarce resource from writing tests to reviewing what an automated system produced, which is a different governance question than the automate-or-not rule covered here. The full argument for revising a strategy around AI-generated tests, including which sections of the document have to change, is a separate treatment on the Autonoma blog.

Yes, and that is a wider role than the maintenance line item Autonoma often gets reduced to. It covers the whole loop for behavioral end-to-end tests: our Planner agent reads your codebase and derives the test cases your routes and flows imply, generates the endpoints needed to put the database in the right state for each one, and runs them against a live preview environment on every pull request, and each failure comes back classified as a real bug, an agent error, or a plan mismatch instead of a red build somebody has to guess at. Our Diffs Agent then adds, updates, or retires cases as the code diff changes. Against the four-term model above, that touches authoring, maintenance, and false-failure cost at once, which is why a low-glamour but machine-checkable flow like CSV export column order stops looking too expensive to justify. What it doesn't do is decide which flows clear the oracle rule, and it isn't a load, accessibility, API contract, or native mobile testing tool.

Related articles

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.

A single disposable tenant boundary spun up inside one shared database, seeded, tested against, and then discarded, next to a separate full database fork labeled as a branch

What Is a Throwaway Tenant? (Disposable Tenants for Safe Testing)

A throwaway tenant is a disposable, isolated tenant created for one test run, then torn down. How it differs from a database branch.