Manual vs Automated Testing

Manual testing is a person exercising the product and judging the result; automated testing is a script exercising the product and comparing the result with an expected value. Neither replaces the other. Automation is the only way to re-check thousands of things on every change; a person is the only way to notice something nobody thought to check.

This guide compares the two on the dimensions that matter to a team — cost over time, speed of feedback, the kinds of defects each finds, maintenance and the skills required — and gives a rule for splitting a test effort between them that holds up in practice.

What each term actually means

Manual testing covers two different activities. Scripted manual testing follows written test cases step by step and records pass or fail; it is repeatable but slow, and it is the part of manual testing that automation replaces. Exploratory testing, defined by Cem Kaner and developed by James Bach and Elisabeth Hendrickson, is simultaneous learning, test design and execution: the tester decides the next step from what the last one revealed. It is not "testing without a plan" — a session has a charter, a time box and notes — and it is the part automation cannot replace.

Automated testing is the execution of pre-written checks by a tool: unit tests, API tests, UI tests driven through Selenium, Cypress, Playwright or Appium, performance scripts. The tool does not decide what to check; a person did, once, when the script was written. Automation therefore finds only the defects someone anticipated — which is exactly what a regression suite is for, and exactly why it cannot be the whole strategy.

Side by side

Automation repeats the checks someone anticipated, in minutes and at scale; manual and exploratory testing bring the judgement that finds new defects.

Manual testing

Scripted test cases followed step by step, and exploratory sessions

Cost curve:
About the same every time it runs
Feedback speed:
Hours or days, when a tester is available
What it finds:
New defects, usability problems, confusing flows, wrong assumptions in the requirements
Consistency:
A person varies: a weakness for regression, a strength for exploration
Maintenance:
Test cases need updating too, but a stale case fails softly
Coverage:
Judgement, manual only: layout, wording, tone, accessibility feel, “does this make sense”
Skills:
For exploratory testing: testers with product and domain knowledge

Automated testing

Pre-written checks executed by a tool

Cost curve:
More up front (writing, infrastructure), less per run: pays back only for checks that run many times
Feedback speed:
Minutes, on every commit
What it finds:
Regressions: things that worked and stopped working
Consistency:
A script runs the same way every time
Maintenance:
Scripts break when the product changes, UI scripts especially; the maintenance budget is part of the real cost
Coverage:
Scale, automation only: a thousand data combinations, every browser, every night
Skills:
Engineers who write maintainable code

The two skill sets can be different people, or the same person on different days.

  • Cost curve — manual testing costs about the same each time it runs; automation costs more up front (writing, infrastructure) and less per run, so it pays back only for checks that run many times.
  • Feedback speed — an automated suite reports in minutes on every commit; a manual pass takes hours or days and happens when a tester is available.
  • What it finds — automation finds regressions: things that worked and stopped working. Manual and exploratory testing find new defects, usability problems, confusing flows and wrong assumptions in the requirements.
  • Consistency — a script runs the same way every time; a person varies, which is a weakness for regression and a strength for exploration.
  • Maintenance — scripts break when the product changes, especially UI scripts; a maintenance budget is part of the real cost. Manual test cases need updating too, but a stale case fails softly.
  • Coverage of judgement — layout, wording, tone, accessibility feel, "does this make sense" — is manual only. Coverage of scale — a thousand data combinations, every browser, every night — is automation only.
  • Skills — automation needs engineers who write maintainable code; exploratory testing needs testers with product and domain knowledge. They are different people or the same person on different days.

When manual testing wins

  • New features — the first pass over something that has never worked before, where the expected behaviour is still being discovered.
  • Usability and localisation — whether an Arabic layout reads correctly right-to-left, whether an error message makes sense, whether a flow is confusing.
  • Unstable interfaces — a UI that changes every sprint makes UI automation a maintenance sink until it settles.
  • One-off checks — a migration, a data fix, a release-day verification that will never be repeated.
  • Exploratory sessions — time-boxed, charter-driven hunting for the defects no case anticipated; the highest defect yield per hour a skilled tester produces.

Try it: Test Scenario Generator Try it: Test Case Generator

When automation wins

  • Regression — every check that must pass on every release belongs in a suite that runs in CI; humans re-running them is the most expensive way to do the least valuable testing.
  • API and contract checks — exact requests, exact responses, a specification to compare against: the ideal automation target, cheaper and more stable than UI tests.
  • Data-driven cases — the same steps over hundreds of inputs: boundary values, currencies, locales, formats.
  • Cross-browser and cross-device — the same journey on every supported browser and screen size, which no team can afford by hand.
  • Performance and load — impossible manually: generating and measuring concurrent traffic is automation by definition.

Try it: Regression Scenario Generator Try it: AI Regression Test Generator Try it: OpenAPI → Test Cases Try it: API Contract Validator Try it: Concurrent Request Test Generator

Deciding what to automate: the pyramid and a simple rule

The test pyramid — many unit tests, fewer API and integration tests, few end-to-end UI tests — is a cost model: a check should live at the lowest level where it can be expressed, because lower levels are faster, more stable and cheaper to maintain. A business rule tested at the API level does not need a UI test; a UI test should exist only for a flow that can fail in the UI.

For any individual check, the rule is: automate it if it will run many times, has a definite expected result, and tests something stable enough that the script will not need rewriting every sprint. Frequency, determinism and stability. A check that fails any of the three is better done by a person, or not at all yet.

  • Start automation at the API level; add UI journeys only for the flows that matter most.
  • Keep the suite fast — a suite that takes an hour stops being run on every change and quietly becomes a nightly report nobody reads.
  • Delete or fix flaky tests immediately; a suite that is sometimes red for no reason trains the team to ignore red.
  • Review the suite for duplicates and dead checks each quarter; automation accumulates.

Try it: AI Test Case Optimizer Try it: AI Duplicate Test Case Detector

How teams combine them

The pattern that works is not a percentage split but a division of labour. The automated regression suite guards what already works and runs on every change in the pipeline — GitLab CI, GitHub Actions or equivalent — so a developer learns within minutes that a change broke something. Testers spend their time ahead of the suite: reviewing requirements, designing cases for the new feature, running exploratory sessions on it, and handing the cases worth keeping to automation once the feature stabilises.

Where AI tools fit is at the drafting stage of both: generating candidate test cases from a story or an API specification, proposing negative and edge cases, drafting the regression scenarios for a change. They shorten the writing; the choice of what to keep, and the exploratory judgement, stay with the tester.

Frequently asked questions

Can automated testing replace manual testing?

It replaces scripted manual regression — repeating known checks by hand — and should. It cannot replace exploratory testing, usability judgement or the review of requirements, because a script only checks what someone anticipated. Teams that "automated everything" typically have a strong regression suite and a growing number of production defects nobody wrote a script for.

What percentage of tests should be automated?

There is no correct percentage; the split follows the product. A stable API-heavy product may run 90% of its checks automated; a product with a rapidly changing UI and a strong usability component may run far less. The better question is whether every check that runs on every release is automated, and whether every new feature gets exploratory attention.

Is AI-generated testing manual or automated?

Neither — it is test design assistance. An AI tool drafts test cases, scenarios or bug reports from a description; a person selects and corrects them, and they are then executed either by hand or by automation like any other case.

Which automation tool should we use?

The one your engineers can maintain. Selenium supports the widest range of browsers and languages; Cypress and Playwright are faster to write and debug for modern web apps; Appium covers native mobile. For APIs, the language of the product's own test framework is usually best. The tool matters less than keeping the suite fast, stable and small.

How do we measure whether the split is right?

Two numbers: the time from a commit to the regression result (should be minutes), and the share of production defects that an existing automated check could have caught (should fall over time). If the first is long, the suite is too slow or too UI-heavy; if the second is high, the suite is not covering what matters.

References

Practice exercise

Decide what to automate for a cinema booking release

Your task

You are one of the two testers on a cinema ticket booking product (fictional): a web app and a REST API that the mobile apps also use. The team releases every two weeks, an automation engineer joins next month, and the product manager wants to know what the engineer should automate first. The material below gives the state of the pipeline and of the existing UI suite, the pricing rule, what changes in this release, ten candidate checks and three questions.

Sort the ten checks with the guide’s rule — frequency, determinism, stability — and the test pyramid into: automate now (at the unit, API or UI level, and how often it runs), manual scripted, exploratory session, one-off, or not yet. Give a one-line reason for each, then answer the three questions. Pen and paper is enough; a boundary value generator helps with one of the checks. Allow 20–30 minutes.

Material
Cinema ticket booking (fictional) - web app and REST API; the mobile apps use that API
Release every two weeks. Team: 2 testers and 4 developers; an automation engineer joins
next month. Pipeline: GitLab CI runs the developers’ unit tests on every commit (4 min).
UI suite today: 38 Selenium checks, 55 minutes, run nightly. About once a week a run is
red though nothing is broken (a timing problem in the seat-map check); nobody re-runs it.

Pricing rule PR-7 (unchanged for two years; the API decides the price, the UI shows it)
  Adult (13 to 64): 45.00 SAR.   Child (3 to 12): 25.00 SAR.
  Senior (65 and above): 30.00 SAR.   Under 3: free, no seat.
  Tuesday: every paid ticket 20.00 SAR.

This release
  New: "Group booking" - 6 to 20 seats in one order. Its screens are still changing;
       the designer changed the group seat selection twice this sprint. Apart from
       the payment step (below), the normal booking screens do not change.
  Change: payment provider replaced on 15 Oct; the old one is switched off that day.
  Date: "blockbuster weekend" on 24 Oct - sales for one film open at 10:00 and the team
       expects far more visitors than on a normal day.

Candidate checks
  K1   Log in, pick a film and 2 seats, pay with a test card, see the ticket’s QR code
  K2   GET /api/screenings/{id}/seats returns the seat map with the status of every seat,
       as the OpenAPI specification describes it
  K3   The price for every combination of age and day follows PR-7
  K4   A seat that one customer is paying for cannot be booked by a second customer
  K5   The seat picker is usable on a 320 px wide phone screen and reads correctly
       in Arabic (RTL)
  K6   Group booking: find what is confusing or broken before the design is final
  K7   After the provider switch on 15 Oct, the 1,214 open orders are all still there
  K8   The checkout works on Chrome, Firefox, Safari and Edge, on a desktop and
       on a phone
  K9   The site still responds when 2,000 customers arrive at 10:00 as sales for
       the film open
  K10  Every error message in the checkout is understandable and tells the customer
       what to do

Questions
  Q1  The product manager says: "Automate everything, then we will not need
      manual testing." Answer in three or four sentences.
  Q2  Which two numbers would you track to see whether the split is right,
      and what should each do over time?
  Q3  What do you change in the existing UI suite, and why?
Steps
  1. Read the material. For each candidate check answer the three questions of the rule: will it run many times, does it have a definite expected result, and is what it tests stable enough?
  2. Classify each check — automate now, manual scripted, exploratory session, one-off, or not yet — with a one-line reason. For every check you automate, name the level (unit, API or UI) and when it runs: on every commit, nightly, or before a date.
  3. Where a check mixes a deterministic part and a judgement part, split it and say which part goes where.
  4. Answer Q1 to Q3.
Show the model answer
Model answer

Overview. Six checks are automated: K1 (UI), K2, K3 and K4 (API), K8 (UI, on a browser grid) and K9 (a load script). The first five pass all three questions; K9 runs only before a date and after risky changes, but a load test cannot be done by hand at all, so it is automated as soon as it has an agreed expected result. Four stay with a person: K5 and K10 are judgement, K6 is exploratory and K7 runs once. "Not yet" is the answer for automating group booking: it waits until the design is final (see K6). The pyramid decides the level: a check lives at the lowest level where it can be expressed, so K2, K3 and K4 are API tests and need no UI test, and of the automated checks only K1 and K8 drive a browser. If your classification differs, check it against the reasons below; a different choice with a written reason is acceptable, a check automated "because it can be" is not.

K1 — automate, UI level, the one end-to-end journey in the pipeline. It runs on every change in GitLab CI and before every release (frequency), ends in a definite result (a ticket with a QR code for the two chosen seats), and apart from the payment step the booking screens do not change in this release (stability). The payment step will change once, on 15 Oct: plan that maintenance for the switch day (the new provider’s test card and screens) rather than calling the flow unstable. Keep the script to the journey; prices, seat status and availability are checked below it.

K2 — automate, API level, on every commit. An exact request, an exact response and an OpenAPI specification to compare against is the ideal automation target, and the mobile apps depend on this contract, so a renamed or missing field breaks them on the day it ships. The check takes seconds and belongs next to the unit tests in GitLab CI.

K3 — automate, API level, data-driven, on every commit; not a UI test, because the API decides the price and the web app only shows it. A developer unit test of the price calculation is an equally valid level, since it is the lowest level that can express the rule. PR-7 has been unchanged for two years (stability), the expected price is exact (determinism) and it is checked on every release (frequency). The rows are the boundaries between the age bands and the two kinds of day, prices in SAR: on a day other than Tuesday, age 2 → free and no seat, 3 → 25.00, 12 → 25.00, 13 → 45.00, 64 → 45.00, 65 → 30.00; on a Tuesday the same ages → free, then 20.00 for the other five. Add rows at the edges of the day in the cinema’s time zone: Monday 23:59, Tuesday 00:00, Tuesday 23:59 and Wednesday 00:00. Before writing those expected results, ask the product owner what "Tuesday" means — the day of the screening or the day of the booking — and record the answer: a check without a definite expected result is not ready to automate.

K4 — automate, API level, in two cases: a seat held while one customer pays is refused to a second customer (two requests one after the other), and two bookings for the same seat sent at the same moment end with exactly one success and one refusal (for example 201 Created and 409 Conflict). The outcome is definite even though the timing is not, and the check matters on every release because a double-booked seat costs refunds and trust. By hand, two testers with two browsers cannot make their clicks land in the same millisecond, so the second case would pass without the race ever being tested; generating concurrent requests is automation by definition. Run it nightly or on every commit of the booking service.

K8 — automate, UI level, nightly and before each release, not on every commit. It is the K1 journey run again on the four browsers, on a desktop and on a phone, through a browser grid with real or emulated devices: one script, eight configurations. By hand it would be the same journey repeated eight times every two weeks — repetitive, deterministic work, exactly what the rule sends to automation — and because K1 is already scripted, the extra cost is configuration rather than new code. It is slower than the rest of the suite, which is why it does not block every commit.

K9 — automate, as a load script that sends the HTTP requests of the seat map and the checkout without a browser; a load test is automation by definition, since 2,000 customers at 10:00 cannot be produced by hand. It runs before 24 Oct and again after any change to the seat-holding or checkout code, against a staging environment sized like production — not against production, and never against a system the team does not own, such as the payment provider, without written permission. Give it a definite expected result before it runs, for example the response time and error rate the team agrees to accept for the seat map and for the checkout; otherwise it produces numbers but no verdict.

K5 — manual, scripted, each release, on a real phone with the Arabic locale. "Usable" and "reads correctly right-to-left" are judgements with no expected value to compare against, so the check fails determinism. Write a short checklist (seat labels readable, seat numbers in the same order as in the hall, the selected seat visible, the price in the right place) so that the check is repeatable. A screenshot comparison can later guard the layout against unintended changes, but it only shows that something changed; whether the result is usable stays a judgement for a person.

K6 — exploratory session, time-boxed and charter-driven, for example: "Explore group booking of 6 to 20 seats, including changing seats and paying, to discover confusing or broken behaviour", in a 60–90 minute session with notes. There is no definite expected result yet — the expected behaviour is still being discovered — and the screens are unstable, so this is the first pass over a new feature that the guide gives to a person. When the design is final, write the cases worth keeping and hand the stable ones to automation, usually one group-booking journey next to K1.

K7 — one-off, by hand or with a throwaway query, not in the suite. It runs once, on 15 Oct, so it fails frequency, and a script would cost more than the check. Do it carefully all the same: record the ids of the 1,214 orders before the switch, compare the list — not only the count — after it, and keep the result with the release notes.

K10 — manual scripted review, with the deterministic part split off. Whether a message is understandable and tells the customer what to do cannot be compared with an expected value; a tester reads each message in context, in English and in Arabic, once per release or whenever a text changes. The deterministic part goes to automation: the API returns the agreed error code (an API check next to K2), and every error state shows a message at all (a step in the UI journey next to K1).

Q1. Automation replaces scripted manual regression — repeating known checks by hand — and it should: K1, K2, K3 and K8 are exactly that, and K9 and the race case of K4 cannot be done by hand at all. It cannot replace exploratory testing (K6), usability and localisation judgement (K5, K10) or the review of requirements, because a script only checks what someone anticipated when it was written. A team that automates everything ends up with a strong regression suite and a growing number of production defects nobody wrote a script for. The realistic promise is different: once the suite guards what already works on every change, the testers’ time moves ahead of it — requirements, new features, exploratory sessions.

Q2. First, the time from a commit to the regression result, which should be minutes and should fall: today the unit tests answer in 4 minutes but the UI suite answers the next morning, so a developer who breaks the checkout learns it a day later. Second, the share of production defects that an existing automated check could have caught, which should fall over time; if it stays high, the suite does not cover what matters, however green it is.

Q3. Fix or remove the flaky seat-map check this week: a suite that is red once a week when nothing is broken trains the team to ignore red, and the fact that nobody re-runs it shows that this has already happened. Go through the 38 checks and move every check of a business rule — prices, seat status, availability — out of the browser and down to the API level, where it runs in seconds; a rule tested at the API level does not need a UI test. Keep in the UI suite only the journeys that can fail in the UI, starting with K1 and later group booking, so that it runs in minutes on every change in GitLab CI instead of once a night; only the cross-browser run (K8) stays nightly. Review the suite for duplicates and dead checks each quarter, and give the automation engineer the rest of this list, in this order, as the first month’s work.

Your progress on this topic

Part of the QA Roadmap

Tools mentioned in this guide

Generate structured test cases (id, title, preconditions, steps, expected result, priority) from a feature description and field list.

Test Design

Generate high-level test scenarios covering functional, negative, security, usability and compatibility angles for a feature.

Test Design

Generate a regression test suite from a change description, diff summary or release notes with Mutqan AI.

Test Generation AI

Generate a structured test-case matrix (positive, negative, auth, boundary) from an OpenAPI / Swagger specification.

Automation

Improve existing test cases: clearer steps, precise expected results, missing preconditions and better structure, with Mutqan AI.

Test Optimization AI

Validate that an API request/response pair conforms to its OpenAPI contract: path, method, parameters, body and response schema.

Validation

Generate concurrency test scripts (k6, JMeter JMX, Locust, Artillery, Node.js) with safe defaults for a target endpoint.

Automation

How Mutqan Soft can help

More guides

More guides