What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Regression testing is testing performed after a code change, configuration change, or environment change to discover whether behavior that previously worked still works. It looks for unintended side effects in parts of the product that were not supposed to change. A related activity, retesting, checks whether the specific defect or requested change was fixed successfully.

For example, adding Apple Pay should not break card checkout, changing a search component should not disable navigation buttons, and fixing a password bug should not break normal login. Regression tests provide evidence that those unchanged behaviors remain intact.

Regression testing in the formal sense

ISO/IEC/IEEE 29119-1:2022 defines regression testing as “testing performed following modifications to a test item or its operational environment, to identify whether failures in unmodified parts of the test item occur.” The important ideas are after a modification and unmodified parts. The test does not have to be a particular technology or run at a particular level.

Regression testing can include unit tests, integration tests, functional tests, system tests, API checks, and user-interface checks. It may be manual, automated, or a combination. A team chooses the scope that gives enough confidence for the risk, time, and impact of the change.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Regression testing versus retesting

Activity Main question Typical evidence
Retesting Did the changed code remove the reported fault or implement the requested behavior? The original failing case now passes.
Regression testing Did the change cause failures in behavior that was already working? Relevant existing tests continue to pass.

A single test run can contain both activities. After fixing a tax calculation, a tester first reruns the tax case that failed (retesting), then checks invoices, refunds, discounts, and payment flows that could have been affected (regression testing).

Why teams perform regression tests

  • Changes often share code, data, services, permissions, or deployment configuration with features that were not edited.
  • Defects can appear only through combinations, such as a new payment method interacting with coupons or mobile layouts.
  • A passing unit test for the changed function cannot prove that callers, integrations, or user workflows still work.
  • Keeping old tests in the suite preserves knowledge of behavior that must not silently change.

Regression testing is therefore a risk-control activity, not a promise that every possible input has been tested. Its adequacy depends on the affected surface and the confidence the release requires.

Practical examples

Adding an Apple Pay option to checkout

A team adds Apple Pay to an existing store. Unit tests can run on each commit, integration tests after a pull request passes those checks, and a broader regression stage can run in the deployment pipeline. Regression coverage should include existing card and bank-payment checkout, coupon application, order totals, confirmation emails, inventory reservation, and cancellation. The new Apple Pay test is partly feature testing; checking the old paths for side effects is regression testing.

Fixing a bug that later returns

MIT OpenCourseWare recommends preserving the input that exposed a defect as a test. Suppose a date parser failed for a particular time-zone transition. Add that input to the automated suite, fix the parser, and retain the test. If a later refactor makes the case fail again, regression testing exposes the recurrence immediately.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Introducing a search bar

Selenium uses the example of checking that a new search bar has not broken other menu buttons. The rerun can be a focused set around the header or a full suite, depending on how widely the navigation component is shared. UI checks can be supplemented by unit tests for query parsing and integration tests for the search service.

Adding password recovery

After implementing “forgot password,” verify the original login mechanism, valid and invalid credentials, session creation, lockout rules, and authorization. The recovery workflow is new functionality; the unchanged login and access-control behavior is regression scope.

How to choose the regression set

  1. Describe the change. Record files, services, schemas, feature flags, infrastructure, and user journeys touched by the change.
  2. Map possible impact. Identify callers, shared components, data migrations, external integrations, permissions, browsers, devices, and operational dependencies.
  3. Start with important existing tests. Include the changed area and high-value paths such as authentication, payments, data loss prevention, and core navigation.
  4. Prioritize by risk. Give earlier execution to failures with serious customer, safety, financial, security, or compliance consequences.
  5. Choose scope deliberately. Run a focused subset when impact is narrow and understood; run broader or full coverage when the change is cross-cutting, the impact is uncertain, or release confidence matters more than feedback speed.
  6. Run, investigate, and rerun. A failure may indicate a product defect, a test defect, environmental instability, or an intentional behavior change. Correct the cause and repeat the relevant checks.
Decision factor Focused selection Broader or full suite
Coverage Likely affected paths More interactions and unknown dependencies
Feedback time Faster Longer and often parallelized
Risk Suitable when impact is well understood Preferable when impact or consequences are high
Maintenance Requires accurate impact analysis Requires stable, maintainable tests and execution capacity

No selection strategy is universally best. The right choice balances execution effort with the confidence needed for that change.

Regression testing at different test levels

Unit regression tests

These check individual functions or classes quickly. They are useful for calculations, validation, parsers, and business rules, but cannot reveal every integration or browser problem.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Integration and API regression tests

These verify contracts between services, databases, queues, payment providers, and authentication systems. Include status codes, schemas, retries, authorization, and representative error responses.

Functional and end-to-end regression tests

These exercise complete user journeys such as signing in, purchasing, exporting, or resetting a password. They cover realistic interactions but generally run more slowly and can be more sensitive to environment failures.

Visual regression tests

Capture a known page or component and compare a new render with an approved baseline. Control viewport, device scale, fonts, data, animations, time zone, and network responses so that harmless rendering variation does not create noise. Review differences rather than accepting every changed pixel automatically.

Automation and CI/CD

Automation makes repeatable regression checks practical, especially when changes arrive frequently. A common pipeline runs fast unit checks on commits, integration checks after they pass, and broader functional or regression stages for a pull request or deployment. Manual exploratory testing remains valuable for workflows that are difficult to model or where a human must assess usability.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

To keep feedback useful, parallelize independent tests, cache safe dependencies, quarantine or repair flaky tests instead of ignoring failures, and use fail-fast behavior for critical failures when the pipeline supports it. Keep test data isolated and make environment assumptions explicit. A failed regression test should identify the test, build, environment, input, expected result, actual result, and reproducible logs or artifacts.

Visual regression capture for web applications

For browser-based products, screenshots can be regression artifacts. Establish a baseline for each supported viewport, then capture the same URL or component after a change. Compare only after the page has reached a deterministic state: wait for a selector or network idle, disable animations, load lazy images, and provide stable authentication and test data. A difference may represent an intended design update, a font-loading failure, a missing image, a responsive breakpoint error, or an unrelated consent popup.

Or skip the browser setup

ScreenshotNeo provides a website screenshot API and MCP server for this visual-regression part of the workflow. It accepts consent banners as a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each step can be disabled. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers report the page verdict and billing status. Its MCP tools—take_screenshot, get_page_info, and capture_pdf—work with Claude, Cursor, and other MCP clients.

One request is enough:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the ScreenshotNeo documentation for parameters. The same request in Python:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)

And Node.js:

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

You can set full-page capture, lazy-image loading, CSS-selector element capture, dark mode, device presets or custom viewports, retina scale, custom CSS and JavaScript, clicks, waits, hidden selectors, blocked resources, headers, cookies, user agents, authorization, time zone, geolocation, transparent backgrounds, resizing, cache TTL, signed links, asynchronous webhooks, PDF options, HTML/CSS rendering, bulk capture of up to 100 URLs per call, and usage reporting. Every feature is on every plan. The free plan includes 1,000 shots per month without a card; paid plans start at $5 for 3,000 shots. Create a free ScreenshotNeo account.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Troubleshooting regression failures

“The new test fails, but the old code passed.”

Check whether the requirement intentionally changed. If it did, update the expected result and document the decision; otherwise isolate the smallest input that reproduces the defect and fix the implementation.

“Only end-to-end tests fail.”

Inspect service availability, test data, credentials, clocks, network dependencies, selectors, and deployment configuration. Reproduce at the API or integration level to separate an application defect from a browser or environment problem.

“The screenshot differs on every run.”

Stabilize fonts, animations, timestamps, randomized content, ads, consent dialogs, viewport dimensions, device scale, and network timing. Wait for a deterministic selector or network-idle condition and compare the same data set.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

“The suite is too slow.”

Run fast, high-risk tests first; parallelize independent work; select tests using impact analysis; and reserve the full suite for changes or release points that justify its cost. Do not remove coverage without recording the risk accepted.

“A test is flaky.”

Capture logs and repeat history, then fix synchronization, isolation, data cleanup, or external dependency problems. A test that is routinely retried without investigation weakens the signal of the entire regression suite.

What a useful regression report contains

  • Build, commit, environment, browser or device, and test-suite version.
  • Change summary and the impact reasoning used to select tests.
  • Passed, failed, skipped, blocked, and quarantined cases.
  • For each failure: steps or input, expected and actual results, logs, screenshots, traces, and defect link.
  • Disposition: product defect, test defect, environment issue, intentional change, or inconclusive result.

Frequently Asked Questions

Is regression testing a separate phase of software testing?

It is a testing purpose and scope, not a mandatory phase or single test level. Teams can perform regression checks in unit, integration, API, functional, system, or visual tests.

Should every regression test be automated?

No. Automation is valuable for repeatable checks, while manual exploratory testing remains useful for complex, changing, or judgment-heavy behavior.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

When should a team run the full regression suite?

Use it when the change is broad, impact is uncertain, consequences are high, or release confidence warrants the additional execution time. A focused suite is reasonable when impact is narrow and well understood.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.