What Is Regression Testing? A Guide for Teams That Ship UI

Last updated: September 24, 2026

Regression testing is re-running tests after a code change to confirm that features which already worked still work. A regression is anything that used to be right and now is not: a broken checkout, a button that shifted 8px, a label that lost its contrast. The goal is to catch those side effects before users do.

What Is Regression Testing?

Wikipedia defines regression testing as "re-running functional and non-functional tests to ensure that previously developed and tested software still performs as expected after a change." The change can be anything: a bug fix, a new feature, a dependency upgrade, a CSS refactor, or a config flag. If something that passed before fails now, that is a regression.

The idea is older than most of the tools that run it. Fred Brooks described the problem in 1975, and the line still explains why every serious team keeps a regression suite:

Program maintenance requires far more system testing per statement written than any other programming. Theoretically, after each fix, one must run the entire batch of test cases previously run against the system to ensure that it has not been damaged in an obscure way. Fred Brooks

Two words in that quote matter for anyone who ships an interface: "non-functional" in the definition, and "obscure" in Brooks. Most regression suites cover function well. The obscure damage is usually visual, and it is usually the part nobody wrote a test for.

Regression Testing vs Retesting vs New Feature Testing

These three get used interchangeably. They answer different questions.

Regression testingRetestingNew feature testing
QuestionDid this change break anything that already worked?Is the bug we fixed actually fixed?Does the new thing work as specified?
ScopeExisting features near, or far from, the changeThe one failing caseOnly the new feature
TriggerAny change: code, dependency, config, stylesA fix is deployedA feature is ready for QA
ExampleAfter a cart refactor, checkout and order history still workThe login test that failed on validation now passesThe new subscription flow works end to end

Types of Regression Testing

Regression testing types are mostly about scope: how much of the suite you re-run for a given change. Pick the smallest scope that still covers what the change could plausibly touch.

TypeWhat you re-runUse it when
Unit regressionTests for the single function or module that changedThe change is isolated, like a pricing calculation
Partial regressionThe changed module plus the modules that depend on itA change touches shared logic, like cart state
Selective regressionA pre-chosen subset: critical, high-traffic, or historically fragile flowsEvery pull request, when a full run is too slow
Complete regression (retest all)The entire suiteBefore a major release, framework upgrade, or redesign
Progressive regressionExisting tests plus new tests written for the change, in the same sprintFeatures change existing behavior on purpose
Visual regressionScreenshots of pages or components, diffed against approved baselinesAny change to styles, layout, fonts, or shared components

The Four Kinds of Regression (and What Catches Each)

The types above describe how much you re-run. A more useful question for a team that ships UI is what kind of thing broke, because each kind needs a different check. A green functional suite says nothing about the other three.

RegressionExampleWhat catches itWhat misses it
FunctionalCheckout button no longer submits the orderUnit, integration, and end-to-end tests (Playwright, Cypress, Selenium)Nothing, if the flow has a test
VisualA shared card component now clips its title on mobileScreenshot diffing against a baseline (Playwright, Percy, Chromatic)Functional tests: the element still exists and still clicks
AccessibilityA brand color update drops body text below 4.5:1 contrastAutomated WCAG checks (axe-core) re-run on every changeFunctional tests, and visual diffs if the new color was approved
Design systemA hard-coded hex replaces a token, so dark mode breaks laterA token audit of the live page against your design tokensVisual diffs: the hex renders identically today

Accessibility is the kind most teams under-cover, and the numbers show it. The WebAIM Million 2026 report found detected WCAG failures on 95.9% of the top one million home pages, up from 94.8% in 2025, and an average of 56.1 errors per page, up 10.1% in a year. Low-contrast text alone appeared on 83.9% of pages. Those are regressions at web scale: the numbers had been improving for six years and then went backwards (WebAIM, 2026).

For more on why a passing suite can still ship a broken page, see Why UIs Pass Every Test and Still Break in Production.

How to Do Regression Testing, Step by Step

A process that works for a team shipping every week:

How Much of the Suite Should You Re-Run?

Running everything on every change is the safest option and, past a certain size, the slowest. The answer at scale is regression test selection: pick the tests most likely to fail for this specific change.

Meta published results from its machine-learning approach, predictive test selection. It learns from historical changes and test outcomes which tests tend to fail for which kind of change. Meta reported it caught more than 99.9% of regressions while running about a third of all tests (Engineering at Meta). Most teams do not need a model to get most of that benefit. Tag tests by the area they cover, run the tags that match the files changed, and run the full suite nightly.

Tip: Selection works for code because tests map to files. It works poorly for styles. A one-line change to a design token or a global stylesheet can touch every page, so treat style changes as a trigger for a wide visual and accessibility pass, not a narrow one.

Automated vs Manual Regression Testing

Automate anything that is repeatable and has a clear pass or fail: flows, API contracts, screenshot diffs, and rule-based accessibility checks. Keep people on the judgments automation cannot make.

What still needs a human, or a check that compares against intent:

This is the gap between regression testing and design QA. A regression suite tells you what changed. Design QA tells you whether it matches what was designed. The two are compared in detail in Design QA vs Visual Regression Testing.

Regression Testing Tools by Layer

LayerToolsWhat they check
FunctionalPlaywright, Cypress, SeleniumFlows still work end to end
VisualPlaywright screenshots, Percy, Chromatic, ApplitoolsPixels still match an approved baseline
Accessibilityaxe-core, WAVE, OverlayQA scheduled scansWCAG rules still pass after each change
Design fidelityOverlayQAThe live page still matches the design and its tokens
Test managementZephyr, TestRailWhich regression cases ran, passed, and failed per release

For a deeper look at the screenshot layer, see Best Visual Regression Testing Tools in 2026.

How to Measure Your Regression Testing

Four numbers tell you whether the suite is earning its runtime:

Catch UI Regressions on the Live Page

OverlayQA covers the layers a functional suite leaves open. In the browser, it detects visual, accessibility, and design-token issues on any page, including localhost and staging, and compares the live build against your design. Scheduled scans re-run accessibility, contrast, and design token checks on the pages you watch, keep a baseline of every finding, and email you only when a scan finds something new or fixed. That is regression testing for the parts of the page no test asserts on.

Your test suite checks that the page works. OverlayQA checks that it still looks and reads right: visual, accessibility, and design-token regressions detected on the live page with AI analysis and CSS extraction. Export to Jira, Linear, Notion, Slack, Asana, Trello, ClickUp, GitHub Issues, Basecamp, or monday.com with the selector, computed values, and screenshot attached.

Frequently Asked Questions

What is regression testing in simple terms?

Regression testing means re-checking things that already worked after you change something. If you fix a bug in the cart and re-run the checkout, login, and order history tests to make sure they still pass, that is regression testing. Anything that used to work and now does not is called a regression.

What is the difference between regression testing and retesting?

Retesting confirms that one specific bug is fixed by re-running the test that failed. Regression testing confirms that the fix, or any other change, did not break something else. Retesting is narrow and targeted. Regression testing is broad and looks at everything the change could have affected.

When should you run regression tests?

Run regression tests after any change to code, dependencies, configuration, or styles: on every pull request for a selected subset, on a nightly schedule for the full suite, and before every major release. Style and design token changes deserve a wide visual and accessibility pass, because one line can affect every page.

Can regression testing be automated?

Most of it can. Functional flows, screenshot comparisons, and rule-based accessibility checks all run well in CI. What automation cannot judge is whether the approved baseline was correct to begin with, whether the page still matches the design, and states the tests never render, such as hover, focus, and error states. Those need a manual or design QA pass.

What is visual regression testing?

Visual regression testing captures screenshots of pages or components and compares them to previously approved baseline images, flagging any pixel difference for review. Tools include Playwright screenshot assertions, Percy, Chromatic, and Applitools. It catches layout and styling changes that functional tests pass over, but it cannot flag a problem that was already present in the baseline.