Functional testing checks that a feature works the way the requirements say. Regression testing checks that features which already worked still work after a code change. Put simply, functional testing asks "does this work?" and regression testing asks "did we just break something?"
The two get mixed up because they often use the same test cases. A test that checks "a user can reset their password" is a functional test the first time you run it against a new feature. Run it again three months later after someone refactors the email service, and it’s now doing regression testing. Same test, different job.
This guide explains the difference properly, with a comparison table, a worked example and a practical way to run both without doubling your effort.

Functional vs regression testing: the short answer
| Functional testing | Regression testing | |
|---|---|---|
| Main question | Does this feature work as specified? | Does everything that worked before still work? |
| Trigger | A new feature or a changed requirement | Any code change, bug fix, dependency upgrade or config change |
| Scope | The feature under test | The parts of the system the change could affect, sometimes everything |
| Based on | Requirements, user stories, acceptance criteria | Existing test cases that already passed |
| When it runs | While a feature is built and before it ships | After every change, ideally on every build |
| Test cases | New ones written for the feature | Reused from earlier functional tests |
| Automation | Helpful, often partly manual at first | Close to essential, because it repeats constantly |
| Finds | Features built wrong or incomplete | Side effects and things that silently broke |
What is functional testing?
Functional testing verifies that each feature behaves according to its requirements. You give the system an input and check the output against what the specification says should happen. It’s black-box testing: you care about what the system does, not how the code does it.
For a new "apply coupon" feature, functional tests would check that a valid coupon reduces the total, an expired coupon shows an error, a coupon can’t be applied twice and the discount appears on the invoice.
What is regression testing?
Regression testing re-runs existing tests after a change to make sure nothing that used to work has stopped working. The name comes from the idea of software "regressing" to a broken state.
The change doesn’t have to touch the feature that breaks. A classic example: a developer updates a shared date-formatting helper for the reports page, and order confirmation emails start showing the wrong delivery date. Nobody touched the email code. Regression tests are what catch that.
Is regression testing a type of functional testing?
Mostly, yes. Regression testing is usually functional in nature, because most regression suites are made of functional tests that already passed. Running them again after a change is what makes them regression tests.
There’s a nuance, though. Regression testing is defined by when and why you test, not by what you test. You can also run non-functional checks as regression tests, for example re-running a performance benchmark to make sure a release didn’t make the search endpoint twice as slow. So a fair summary is: regression testing is a practice that mostly reuses functional tests, rather than a separate type of test with its own cases.
Functional regression testing explained
Functional regression testing is the overlap between the two: re-running functional test cases after a change to confirm the features still behave correctly. It’s what most teams mean when they say "regression testing."
There are a few common ways to scope it:
- Retest all: run the full suite. Safest, slowest, and fine if the suite is fast and automated.
- Selective regression: run only the tests related to the changed code and the features that depend on it.
- Risk-based regression: prioritize tests for critical flows such as payments, login and data integrity, then add the rest as time allows.
- Partial regression after a fix: retest the fixed bug plus the area around it.
We go deeper into each approach in our guide to the types of regression testing.
A worked example
Say your team ships a new feature: customers can split a payment between a gift card and a credit card.
Functional testing for the new feature:
- Pay 30 with a gift card and 70 with a credit card, and confirm both charges succeed and the order is marked paid.
- Try a gift card with an insufficient balance and confirm the right error appears.
- Confirm the receipt shows both payment methods.
Regression testing after it ships:
- Run the existing checkout suite: single-card payments, saved cards, coupons, tax calculation, refunds.
- Run tests for anything that reads payment records, such as order history, invoices and refunds.
Two weeks later, a developer upgrades the payment SDK to fix an unrelated bug. No new features, so no new functional tests. But the entire payment regression suite runs, and it catches that refunds to gift cards now fail. That is the job regression testing exists to do.

When to use each
Use functional testing when:
- A new feature is built or an existing one changes behavior.
- Requirements or acceptance criteria are updated.
- You need to confirm a bug fix actually fixes the bug.
Use regression testing when:
- Any code is merged, even a small refactor.
- Dependencies, frameworks or infrastructure are upgraded.
- Configuration changes, such as feature flags or environment variables.
- Before every release, as a final safety net.
In practice the answer is "both, all the time." New functional tests are written for each feature and then join the regression suite, which grows with the product.
How functional and regression testing work together
The healthiest setup treats them as one pipeline:
- Write functional tests while building a feature.
- Once the feature ships, those tests move into the regression suite automatically.
- Every pull request runs the relevant part of the regression suite.
- Every production bug gets a new test, so that exact bug can’t come back unnoticed.
The catch is size. A regression suite that grows with every feature gets slow and brittle if it is mostly UI tests or hand-written API scripts that nobody updates. That’s where most teams struggle, and it’s why automation is close to mandatory for regression testing. Our guide to automated functional testing covers how to build a suite that stays fast.
Automating functional and regression testing with Keploy
Keploy helps with both at once for APIs and backend services. It records real API traffic and the calls your service makes to databases and other services, then turns them into test cases and mocks. The same tests that verify behavior today replay in CI on every change, which makes them a ready-made automated regression testing suite without writing scripts by hand.
When a response changes unexpectedly, the test fails and shows you exactly which field changed. When you change an API on purpose, you re-record.
Try Keploy API testing to generate functional and regression tests from real traffic.
For other options, see our list of regression testing tools.
FAQs
What is the main difference between functional and regression testing?
Functional testing checks that a feature works according to its requirements. Regression testing checks that existing features still work after a change. Functional testing focuses on new or changed behavior; regression testing protects behavior that already worked.
Is regression testing functional or non-functional?
Regression testing is usually functional, because it mostly reuses functional test cases. It can also include non-functional checks, such as re-running performance benchmarks after a release.
What is functional regression testing?
Functional regression testing means re-running functional test cases after a code change to confirm that existing features still behave correctly. It’s the most common form of regression testing.
Can the same test case be used for functional and regression testing?
Yes. A test is a functional test when it first verifies a new feature. When it runs again after later changes to confirm nothing broke, it’s acting as a regression test.
Which comes first, functional testing or regression testing?
Functional testing comes first, while a feature is built. Once the feature passes and ships, its tests join the regression suite and run after every later change.
Should regression testing be automated?
In most cases, yes. Regression suites run after every change and keep growing, so running them manually becomes too slow and too easy to skip. Automate the stable, high-value tests first.

