Regression Testing: Types, Process, and How to Pick a Smaller Suite
A practical guide to regression testing types, techniques, and process, focused on choosing the right subset of tests instead of re-running everything.

A QA lead at a mid sized SaaS company gets a familiar message on a Tuesday afternoon. A developer just shipped a small change to the checkout flow, and the release is scheduled for Thursday morning. The safe move feels obvious: run the full test suite, all 900 cases, and wait.
That run takes 50 minutes if nothing flakes, longer if something does. It tells the team almost nothing they did not already know. 870 of those cases touch code the change never went near. This is what regression testing looks like when it is treated as a ritual instead of a design problem.
This post walks through what regression testing actually is, the types and techniques that exist, the process that ties them together, and how to pick a subset of tests that catches real problems without eating your whole afternoon.
What is regression testing, and how is it different from retesting
Regression testing checks that a change has not broken something that used to work. It is not the same thing as retesting, which is the narrower act of re-running a specific test after a bug fix to confirm that exact bug is gone.
Retesting answers one question: did we fix the thing we found. Regression testing answers a bigger question. Did fixing that thing, or shipping that feature, break something unrelated. A team can pass retesting and still ship a regression, because the fix touched a shared function that three other features depend on.
The distinction matters because teams often stop at retesting and call it done. Picture the checkout bug from a Tuesday sprint. The bug is fixed, the ticket is closed, and the fix passed retesting cleanly.
Nobody checks whether the fix broke the gift card code, because the gift card feature shares the exact same pricing function and nobody thought to look there. Two weeks later a support ticket comes in about gift cards failing at checkout, and the root cause traces back to that same fix.
Why regression testing matters
Software rarely breaks because a team wrote a new feature badly. It breaks because a change to one part of the system has a side effect somewhere else that nobody was watching. Regression testing exists to catch that side effect before a customer does.
Consider the Safari only checkout bug that reached a customer because the regression suite only ran in Chrome. A developer changed how the payment form validated card numbers. The change worked perfectly in every browser the team tested.
It also broke a date picker that only rendered differently in Safari, and nobody noticed until a customer on an iPhone could not complete a purchase. The fix itself was fine. The gap was in what got checked afterward.
That is the cost regression testing is meant to prevent. Functionality that worked last week silently fails this week, and the first person to discover it is a paying customer instead of a test suite. A support ticket costs far more than the two minutes it would have taken to add a Safari case to the suite.
Types of regression testing
Not all regression testing looks the same, and picking the wrong type for the situation is how teams end up either missing bugs or wasting a day re-running everything.
- Full or complete regression testing: every test case in the suite runs, typically before a major release or after a large structural change
- Partial regression testing: a defined subset runs, scoped to the modules a change is known to touch
- Unit regression testing: isolated re-runs of unit tests for the exact function or class that changed, done immediately by the developer
- Progressive regression testing: new test cases are added and run alongside existing ones as requirements evolve, keeping the suite current rather than static
- Corrective regression testing: existing test cases are re-run unchanged because the underlying requirements have not changed, only the code
- Selective regression testing: a curated subset chosen based on impact analysis, rather than the whole suite or a naive module scope
Most teams use partial or selective regression testing day to day, and reserve full regression for release candidates. A team shipping a small copy change to a settings page does not need the same regression treatment as a team rewriting the authentication service.
A useful test: ask how many features share code with the thing that changed. A copy change on a settings page shares nothing. A change to a shared pricing function, like the one in the checkout example, shares code with every feature that calculates a price.
Regression testing techniques
Once you know which type fits the situation, you still need a technique for choosing which cases to run.
- Retest all: run every existing test case regardless of what changed, the slowest and most exhaustive option
- Regression test selection: analyze the change, map it to the code paths it touches, and run only the tests covering those paths
- Test case prioritization: rank tests by risk and business impact, and run the highest priority ones first if time is limited
- Hybrid approaches: combine selection with prioritization, running the mapped subset in full and adding a few high risk cases from elsewhere as a safety margin
The hybrid approach is what most experienced QA leads settle on. Pure selection can miss an interaction between two areas that looked unrelated on paper, like the pricing function shared between checkout and gift cards.
Prioritization alone can waste time on high priority tests that the change could not possibly have affected. The combination catches more with a smaller time budget than either technique alone. A team with 900 total cases might run 40 selected cases plus 10 high priority cases from unrelated areas, for a 50 case run that finishes in under 10 minutes.
The regression testing process, step by step
A workable regression testing process usually has four stages, run in this order.
First, identify the impacted areas. This means reading the diff, the ticket, or the pull request description, and mapping it to the features and modules it touches. A change to a shared authentication function touches more than the login page.
It touches password reset, session timeout, and any feature gated behind a login check. This step is where that gets caught before it is missed.
Second, select and update the test suite. Pull the existing test cases that cover the impacted areas, check whether any are stale or missing, and add new cases if the change introduces new behavior that nothing currently covers.
A team that skips this step often discovers, mid execution, that half the relevant cases were written for a version of the feature that no longer exists. That discovery on a Thursday morning, an hour before a release window, is a bad time to find it.
Third, execute the suite. This is the part most people picture when they hear regression testing, but it is only useful because of the two steps that came before it. Running the wrong 40 cases quickly is not meaningfully better than running the wrong 900 slowly.
Fourth, report the results. A pass or fail count is not enough. The report should say which areas were covered, which were deliberately skipped and why, and what the residual risk looks like for anything not run. A release manager deciding whether to ship on Thursday needs that context, not just a green checkmark.
Tool categories for managing regression suites
Different tools solve different pieces of this problem, and no single category does all four steps well.
- Test case management tools organize the suite itself, track which cases exist, and record execution history over time
- Automation frameworks execute the selected or prioritized subset without a person clicking through each step by hand
- CI integrated tools trigger regression runs automatically on a pull request or merge, and surface results where developers already work
- Reporting and analytics tools turn raw pass or fail data into trends, like which areas fail most often after a change
A QA lead choosing tools for regression testing should think about which of these four jobs is currently the weakest link. A team with a solid automation framework but no clear record of which test case maps to which requirement has a different problem than a team with great documentation but no execution history.
Buying a new automation framework will not fix a documentation gap, and buying a documentation tool will not make an existing suite run any faster. The two problems need two different fixes.
Why traceability keeps a regression suite from growing forever
A regression suite that only ever gains test cases and never sheds any becomes the 900 case, 50 minute suite from the opening example. The fix is not deleting cases at random. It is tracing each test case back to the requirement or change that created it.
When a requirement is deprecated or a feature is removed, traceability makes it obvious which test cases existed only to cover that requirement, and those can be retired with confidence instead of guesswork.
Say a product drops a legacy discount code format after a year of deprecation warnings. Without traceability, the 12 test cases written for that format sit in the suite indefinitely because nobody remembers why they exist or whether removing them is safe.
With traceability, a QA lead can see exactly which requirement each case maps to, confirm the requirement is gone, and retire the cases in minutes. That is the difference between a suite that shrinks when it should and one that only ever grows.
Making the coverage design decision, not just the run decision
The team from the opening example does not need to run all 900 cases on Thursday. They need to know which 40 cases actually exercise the checkout code path the change touched, plus a handful of high risk cases elsewhere as a safety margin.
That is a five minute run instead of fifty. It tells them something the full run could not: exactly what was checked, and exactly what was not.
That clarity matters more than raw speed. A team that runs 40 well chosen cases and can name what they covered is in a stronger position on release day than a team that ran all 900 and cannot say, with any confidence, which of them actually touched the changed code.
Regression testing done well is a coverage design problem, not a re-run ritual. The skill is knowing which subset of a suite actually matters for a given change, keeping that mapping current through traceability, and only reaching for a full run when the change genuinely warrants it. Teams that make this shift stop dreading Thursday releases, because the question changes from "did we run everything" to "did we run the right thing."
Questions people ask
How is regression testing different from retesting?
Retesting confirms a specific bug fix worked. Regression testing checks whether that fix, or any change, broke something else that used to work.
Do you need to run a full regression suite before every release?
Not usually. Selective or hybrid approaches that target the code paths a change actually touches catch most real regressions in far less time than a full retest all run.
What is the difference between progressive and corrective regression testing?
Progressive regression testing adds new test cases as requirements evolve. Corrective regression testing re-runs existing cases unchanged because only the code changed, not the requirements.
How often should a regression suite be reviewed for stale or duplicate cases?
Many teams review during each planning cycle or whenever a requirement changes, so the suite reflects what the product actually does rather than what it used to do.
Can regression testing be fully automated?
Automation frameworks can execute selected test cases without manual clicking, but deciding which cases to select and interpreting the results still benefits from human judgment.
Try Tesbo, or get the next useful idea
Start building your testing workflow now, or get one practical email a month.
Start freeOne email a month
What we shipped, what we learned, and the occasional infographic worth pinning. Unsubscribe in one click.


