Article

Regression Testing: Examples, Strategy, and Automation

October 19, 2026

Learn how regression testing works, choose the right test cases, build a reliable automated suite, and compare approaches for faster release feedback.

Learn how regression testing works, choose the right test cases, build a reliable automated suite, and compare approaches for faster release feedback.

A new feature isn't the only thing that can disrupt existing software behavior. Dependency updates, feature flags, and payment provider configuration changes can also introduce unexpected problems. 

The challenge grows with the application. Each release brings more tests, and failures don't always point to real defects. Teams need a way to choose meaningful checks without losing sight of the risks they haven't covered. Regression testing catches these issues by verifying that previously working functionality still behaves as expected.

This guide covers regression test cases, selection and prioritization, CI/CD runs, failure diagnosis, and automated regression testing tools. The same example also shows how to evaluate Functionize Studio without confusing a repaired test with a repaired application.

What Is Regression Testing?

Regression testing is a software testing practice that checks if recent changes have introduced defects into previously working parts of an application. The ISTQB glossary treats it as testing done after a change, and good practice starts with an impact analysis of the areas that change could reach. 

A regression test suite is the set of checks a team maintains and runs for this purpose. It mixes older tests with new ones added after each fix or feature and spans every level, from unit tests to full browser journeys. Testing a brand-new feature is a separate job, since that work asks whether the new code meets its own requirements.

A full suite run has limits. It checks the behaviors someone thought to write down, and nothing beyond them. A green suite lowers release risk without proving every path through the app still works.

Regression Testing vs. Retesting, Smoke Testing, and Functional Testing

Regression testing checks that recent changes haven't broken existing functionality, while retesting confirms that a specific defect has been fixed. Smoke testing checks whether critical features work before deeper testing begins. Functional testing takes a broader approach by verifying that individual features behave according to their requirements.

Approach Main question Checkout example
Regression testing Did the change break existing behavior? A checkout update quietly breaks refunds
Retesting (confirmation testing) Is the reported defect actually fixed? Rerunning the steps behind a wrong refund calculation
Smoke testing Is this build stable enough to test further? Login and checkout both load and respond
Functional testing Does the feature meet its requirements? The new discount follows its eligibility rules

ISTQB calls retesting confirmation testing, and it helps because bug trackers blur the two all the time. A confirmation test targets one fixed defect, while a regression run looks around that fix for side effects. The labels overlap in practice too, so a functional test written for the discount rules can later join both the smoke set and the regression suite.

Regression Testing Example: A Checkout Change With Unexpected Effects

Let’s start with an illustrative example scenario - most checkout teams will find it relatable. A team adds a promotional-code field to checkout, where the code SAVE10 takes 10% off carts of $50.00 or more. 

Before anyone writes a test, the team lists what must keep working. Totals must still add up, and the customer must still be charged the right amount. Each order still gets created exactly once, and refunds still follow the agreed rules.

Existing behavior Possible regression How to verify Test layer
Discount eligibility An ineligible order gets a discount Eligibility and discount amount Unit/component or API
Order totals Checkout and stored totals disagree Expected total against the stored total API/integration
Payment The wrong amount gets charged Amount on a sandbox payment record Integration, with selected E2E
Order creation A retry creates a duplicate order One stored order under the agreed retry conditions API/integration
Inventory Stock drops by the wrong count The inventory change after the order Integration
Confirmation Success shows before the order exists Confirmation page matches a real order record E2E
Refund The wrong refundable amount gets used The agreed refund calculation Unit/API, with selected E2E

Discount math runs fastest and most reliably at unit or API level, where a test can try dozens of codes in seconds. Only a few journeys need a real browser, and the confirmation page is the clearest case.

Expected results are written before anything runs. A finished click path and a friendly "Thank you" page prove very little on their own. The confirmation check passes only when the page matches a real order record with the right total.

Three cases give the promo field a fair first test:

Case Input Expected result
Positive SAVE10 on an eligible $80.00 cart $8.00 off, $72.00 charged, one order created
Invalid input The expired code SAVE10-OLD on the same cart Code rejected, full $80.00 charged
Boundary SAVE10 on a $50.00 cart, then a $49.99 cart Discount at $50.00, no discount at $49.99

The invalid case passes when the app refuses the expired code. A negative test expects a rejection, and it fails only when the app accepts something it shouldn't.

Boundary rows like the $49.99 cart are where data-driven tests shine. One reusable test can carry every code and cart value as a table row. The data-driven testing guide walks through that setup with a full dataset.

Regression Testing Techniques: Selection, Prioritization, and Full-Suite Runs

Selection decides which checks run, and prioritization decides their order. A full-suite run skips selection altogether, which is useful at the right moments and expensive at all the others.

Full-Suite Regression Runs

A full run makes sense after high-impact changes, such as a payment provider upgrade or a database migration. Release candidates often get one too, along with a scheduled run every night or weekend that catches whatever narrower selections missed. "Full" here means the maintained suite, which still falls far short of every possible behavior.

Regression Test Selection

Selection starts with the change itself and works outward. The promo-code change touches the pricing service, so checks for shared pricing logic join the set alongside the checkout and refund journeys that call it. Past defects in the area pull in more checks, and so does honest uncertainty about how far the change reaches.

Regression Test Prioritization

Prioritization orders the selected checks so the most useful answers come back first. Business impact and failure likelihood carry the most weight, with recent change exposure and past defect patterns close behind. Fast checks with clear verdicts move up too, since a ten-second API test that fails tells the team more than a twenty-minute journey still running.

Putting Them Together

For the promo release, the team selects every check that touches pricing and checkout. Payment and order-creation checks go first, and the broader journeys and refunds wait until the discount math comes back clean. Impact analysis still has blind spots, which is exactly why the scheduled full run stays on the calendar.

How to Build a Regression Test Suite

A regression suite works best when it starts from risk instead of from whatever tests already exist. Teams that pour every old test into the suite end up with slow runs and duplicate checks. 

Identify Critical Behavior and Change Risk

Start with business-critical workflows such as payments, transactions, and account access. Data integrity, permission checks, shared components, and third-party integrations deserve similar attention because several features may depend on them.

Previous production defects also reveal gaps in existing coverage. A backend defect might corrupt records or expose sensitive information without producing an obvious error on the screen.

Choose the Appropriate Test Layer

Next, decide where each test belongs. Unit and component tests work well for isolated calculations and business rules, while API and integration tests verify interactions between services.

End-to-end (E2E) tests become valuable when several parts of the application must work together, such as completing checkout. The right mix depends on the application's architecture and risks, not a fixed percentage of unit, API, or E2E tests.

Define Assertions, Setup, and Cleanup

Every regression test needs clear conditions and measurable expectations. Its definition should cover the initial state, controlled test data, actions, expected outcomes, and cleanup requirements. Clear ownership also helps teams resolve failures and maintain cases as the application changes.

A standard test-case template keeps these details consistent.

Field What to record
Test ID Stable identifier
Protected behavior Outcome that must remain correct
Risk Why a failure matters
Preconditions Required state and dependencies
Test data Controlled inputs
Expected result Specific measurable outcome
Test layer Unit, component, API, integration, or E2E
Execution stage PR, scheduled, or release
Owner Responsible person or team

Organize the Suite for Execution

Group tests by business area and tag them by risk, environment, and execution stage to make them easier to manage. Fast, reliable checks can run on pull requests, while longer cross-system tests may run nightly or before release.

Review and Maintain the Suite

A regression suite needs to evolve alongside the application. When a defect reaches production, its reproduction case may become a permanent regression check against recurrence.

Teams can consolidate duplicate coverage, update tests when expected behavior changes, and retire obsolete cases. Regular reviews also help identify unreliable tests that create noise without providing useful evidence.

When to Run Regression Tests in CI/CD

Not all regression checks belong at the same point in a continuous testing pipeline. Fast checks run on every pull request, while slower journeys wait for a deployed build or a schedule. The table shows one reasonable split, not a schedule every team has to copy.

Stage Checks that run Purpose
Pull request Fast lower-level checks and the relevant integration tests Early feedback while the change is fresh
Deployed test build Critical smoke checks and selected E2E journeys Confirms the assembled app behaves
Scheduled run Broader workflows across environments and browsers Finds gaps that targeted runs miss
Release candidate Coverage in proportion to release risk Supports the release decision
After deployment Safe synthetic checks and monitoring Confirms important live behavior

A few habits make these runs trustworthy. Every result includes the build ID, environment, and feature-flag settings, so nobody has to guess which version failed. Tests get their own data, and blocked or skipped checks show up in the report instead of quietly vanishing.

Parallel runs cut wait time, though only up to a point. Playwright spreads tests across workers, and Selenium Grid runs browser sessions across many machines. Extra workers help only when the test data and the environment can take the extra load.

The release decision needs more than a pass rate. Critical checks must finish, and every relevant failure needs an investigation. Any excluded check or accepted risk stays visible in the report, along with the name of the person who signed off on it.

Manual vs. Automated Regression Testing

Manual regression testing relies on testers to check existing features, while automated regression testing uses scripts to repeat checks faster and consistently.

Factor Leans automated Leans manual
Frequency Runs on most builds Runs rarely
Repeatability Same steps every time Steps vary with what the tester finds
Expected outcome Stable and specific Open to interpretation
Setup and upkeep Cheap to prepare and keep current Costly setup for a rare case
Human judgment Little needed Central to the check
Evidence Logs and traces on every run Notes and screenshots from the session

The promo discount math is a clear automation candidate, since the same calculations run on every build and the right answer never depends on opinion. Selected browser journeys follow close behind because they protect service connections. Exploratory testing sits elsewhere, chasing risks nobody scripted, and it's a different activity from clicking through a checklist by hand.

Regression Testing Tools and Automation Approaches

The useful way to compare automated regression testing tools is to ask who owns what after the first test is written. Feature checklists hide that question.

Option What it is Good fit What the team still owns
Selenium WebDriver-based browser automation with bindings for many languages Teams that need WebDriver control or already have Selenium skills Test design, assertions, Grid or cloud infrastructure, upkeep
Playwright Browser automation with its own test runner Teams building web regression suites in code Test design, data, configuration, code upkeep
Cypress Web testing tool for end-to-end and component tests Teams that want both test types in one place Test design, isolation, configuration, fit with supported workflows
Functionize Studio Agent native testing written in plain language Testers who want agents to handle authoring, runs, diagnosis, and upkeep Expected behavior, coverage priorities, review, the release call

A comparison only means something when the workflow stays the same. Building the promo-code journey in each tool and then changing the UI shows the real gap in setup and upkeep. Browser coverage also differs from native mobile or desktop support, and a fair comparison keeps the two apart.

Common Regression-Testing Failures and How to Diagnose Them

A red result doesn't always mean a broken product, and a green one doesn't always mean it works. Tests fail for their own reasons, and weak tests can pass right over a real bug. Sorting one from the other is the daily work of running a regression suite.

Symptom Likely cause Next step
A calculated total is wrong A real business regression Assertion kept, app investigated
A test can't find a moved element Interaction failure Element identification repaired, intended behavior confirmed
Tests fail only when run together Shared state or colliding data Separate setup and data per test
A service is unavailable Dependency or environment problem Coverage reported as blocked, availability checked
A test passes on retry Intermittent failure First failure and its evidence kept for investigation
A test passes despite a wrong order Weak assertion Checks on the stored business outcome
A valid requirement change causes a failure Outdated expected result Spec update reviewed and approved

Retries and quarantine both have a place, and both can hide real problems. A test that passes on retry still failed once, so the report keeps the first failure and its evidence. A quarantined test needs an owner and an end date, or it drops out of the release evidence for good.

The wrong-total row deserves the hardest line. When the checkout total comes back wrong, the assertion stays as written, and the investigation moves to the app. Changing the expected value is reserved for an approved business-rule change, and nothing else.

Automated Regression Testing With Functionize Studio

Functionize Studio approaches the same checkout suite from the tester's side. The tester describes the promo-code journey in plain language, including the cart and the order total it should end with. Studio builds the steps and the checks from that request, and the tester reviews them before the first run.

The demo runs against a controlled checkout build, where the valid code should take $8.00 off the $80.00 cart. Studio can check the order record past the confirmation page, so a friendly thank-you screen alone isn't enough to pass. Related checkout checks run together as one orchestration, across browsers in parallel.

The first planted change is harmless: the promo field moves, and its button gets a new name. Studio is built to re-identify an element like that mid-run and heal the step, and the run should stay green because the business result hasn't changed. A pass here also means the healed step shows up in the report, where the tester can confirm the repair still checks the right thing.

The second planted change is a real bug, where the build charges the full $80.00 even with a valid code. Healing has nothing to repair in that case, because the element didn't move and the expected total stays $72.00. A pass for this part of the demo is a red run, with Studio's diagnosis marking a real regression and the evidence pointing at the payment step.

That split is what the demo exists to test. Healing should repair how a test interacts with the page, not what the business expects. You set the standard, and so does the release call, backed by evidence from every check behind it.

The Studio overview shows how the agents fit together, from authoring to diagnosis. The Free plan gives enough room to build the promo-code journey and watch both cases play out. Sign-up is self-serve, so you can start testing directly without a sales call.

How to Evaluate a Regression Testing Tool

A vendor demo on a sample app shows very little about life with a real suite. The honest test is a short pilot on one representative workflow from your own product, with agreed behavior and controlled data. The pilot then intentionally introduces two problems: a harmless UI change and a seeded business defect.

A good tool heals the first and catches the second, with clear evidence for both. A weak one either breaks on the UI change or heals its way right past the real bug. The team also tracks how long each stage took, from writing the first test to triaging the seeded bug, against success criteria agreed before the pilot starts.

Area What to check
Critical workflows Journeys that cross several systems, end to end
Private app access How the tool reaches staging apps behind a firewall
Access control Sign-in options and roles for who can change tests
Environments and data How test data gets set up, isolated, and cleaned
Parallel runs How many checks run at once, and what limits them
Evidence Logs, screenshots, and traces tied to each build
Review of test changes How healed steps and edits get surfaced for approval
Release fit How results reach the pipeline and the release decision
Coexistence How the tool sits beside the suites already in place
Ongoing cost Run limits and the cost of a typical week of builds

Ongoing costs deserve the hardest look. The build is easy, and maintenance has no end date. A platform pays off when it takes that maintenance off the team while the tester still owns what every test expects.

Frequently Asked Questions

What Is the Difference Between Regression Testing and Retesting?

Retesting, also called confirmation testing, checks that one specific defect is fixed. Regression testing checks that the fix, or any other change, didn't break something else. Both usually run after a bug fix, one on the fix itself and the other around it.

When Should Regression Testing Be Performed?

Regression checks run after any change that could affect existing behavior. That includes code changes and dependency upgrades, as well as config and connected-service updates. In a CI/CD pipeline, fast checks run on every pull request, and broader runs happen on a schedule or before a release.

Which Regression Tests Should Be Automated First?

The first candidates are high-risk behaviors that run often and have stable expected results. Payment amounts and order totals usually top the list. Checks for defects that have already escaped to production also make strong early additions.

Does Regression Testing Require Running Every Test?

No, and most teams don't. They select the checks related to a change and run them in priority order. A full run of the maintained suite still happens on a schedule or before major releases, and even that run doesn't cover every possible behavior.

Can Regression Testing Be Performed at API Level?

Yes, you can run regression tests at the API level. API checks provide faster, more stable answers for business rules like discount math or order creation. Browser tests then cover the journeys where the user-facing result matters most.

How Does Self-Healing Affect Regression-Test Reliability?

Self-healing fixes how a test finds and uses an element after the UI changes. It never changes what the test expects, and a good tool keeps those two things clearly apart. A moved button heals, but an incorrect order total stays a failure until someone fixes the app.

About the author

author photo: Tamas Cser

Tamas Cser

Founder & CEO

Tamas Cser is the founder, CEO, and Chief Evangelist at Functionize, the leading provider of AI-powered test automation. With over 15 years in the software industry, he launched Functionize after experiencing the painstaking bottlenecks with software testing at his previous consulting company. Tamas is a former child violin prodigy turned AI-powered software testing guru. He grew up under a communist regime in Hungary, and after studying the violin at the University for Music and Performing Arts in Vienna, toured the world playing violin. He was bitten by the tech bug and decided to shift his talents to coding, eventually starting a consulting company before Functionize. Tamas and his family live in the San Francisco Bay Area.

Author linkedin profile