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

Functional testing checks whether software behaves as intended; regression testing checks whether a change has broken behavior that already worked. They are not competing test types: a functional test can also be part of a regression run when it is repeated after a code change to look for unintended effects.

Functional testing and regression testing compared

The simplest distinction is the question each test is meant to answer. Functional testing asks whether a feature or system behaves according to its requirements or specifications. Regression testing asks whether a change—such as a fix or feature addition—has caused a failure in existing functionality.

Aspect Functional testing Regression testing
Main question Does the software do what it is supposed to do? Did a change break something that previously worked?
Typical reason to run it A behavior or requirement needs to be checked. A change has been made and existing behavior needs to be checked again.
How tests are selected Choose cases that exercise the behavior or requirement in question. Select previously run cases relevant to the changed code and possible side effects; the run can be partial or broad.
What the label describes The behavior being checked. The reason for repeating a check after a change.

Selenium’s testing documentation describes functional testing as checking whether a feature or system works as expected. It describes regression testing as reusing previously executed tests after a change to detect unintended effects. The two labels therefore describe different dimensions of a test, not mutually exclusive boxes.

Can a test be both functional and regression testing?

Yes. “Functional” identifies what the check verifies; “regression” identifies why it is being run again. Suppose a team changes checkout. An existing test that checks whether payment proceeds as expected is functional because it checks expected behavior. If the team reruns it after the checkout change to catch a newly introduced failure, that execution is also part of regression testing.

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

A regression run can contain functional tests and other test types. It need not be a separate category of test script or a completely different test suite. A team may rerun every relevant test, or choose a smaller set based on the change and the areas it could affect.

Examples: a new feature and a bug fix

Adding a search bar

Checking that a search for a known term returns the expected results is a functional check of the new search behavior. After the search change, checking that existing menu buttons still open their menus is regression testing: those behaviors worked before, and the purpose is to see whether the new work disturbed them.

Changing checkout

Checking that a customer can complete the intended payment flow verifies checkout behavior. Rerunning an existing payment test after changing checkout can serve both functional and regression purposes. The same test case can answer “does this flow work?” while helping find breakage introduced by the change.

Fixing a reported defect

Imagine a defect report says that submitting a form with valid information produces an error. First, check the original failure condition again to determine whether the fix resolved that reported problem. Then run relevant checks on nearby or dependent behavior to look for unintended consequences. The first activity is confirmation testing, often called retesting; the second is regression testing.

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

Confirmation testing is not the same as regression testing

Confirmation testing targets the specific defect: under the reported conditions, does the failure still happen? Regression testing looks wider: has the fix caused another failure in functionality that was already working? ASTQB’s Foundation Level material distinguishes these purposes.

Rerunning only the test that failed before the fix can establish whether that particular failure appears to be resolved. By itself, it does not provide broad regression coverage. Conversely, a broad regression run that does not reproduce the original defect may not clearly confirm that the reported issue is fixed. Plan for both questions when the risk warrants it.

How to choose regression tests after a change

A regression suite does not have to be identical for every change. The useful set is the one that checks previously working behavior plausibly affected by the change. Start with what changed, identify the behavior that depends on it, and choose the existing checks that give meaningful coverage of those paths.

  1. Identify the change. Note whether it is a defect fix, a new feature, or another modification, and which behavior or requirements it touches.
  2. Confirm the intended behavior. Select a check for the changed behavior itself. For a defect fix, include the original failure conditions where they can be reproduced.
  3. Trace likely side effects. Consider existing behavior that uses the changed area or depends on its output. For a search-bar change, for example, existing navigation behavior may be worth checking if it shares affected code or page interactions.
  4. Choose a practical scope. Rerun the relevant subset when that is sufficient for the change’s risk and reach. Use a broader set when the potential impact is broad or the team cannot confidently isolate affected behavior.
  5. Record what the run establishes. Distinguish a confirmed fix from the separate result of checks for unintended breakage. A passing selected subset says what those checks covered; it does not mean every possible behavior was tested.

This is a selection principle, not a guarantee that a small suite will find every side effect. Test coverage depends on which cases exist and whether the selected cases exercise the affected behavior.

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

What automation changes—and what it does not

Automation is a way to execute checks, not the definition of functional or regression testing. A person can perform either kind of check manually. Automated tests can also be functional, regression, or both, depending on the behavior they verify and the reason they are being rerun.

For web applications, Selenium documents functional tests that simulate expected behavior. Selenium WebDriver controls a browser through browser automation APIs, while Selenium Grid supports running tests across multiple machines and platforms. These are examples of browser-automation capabilities, not requirements for every application or team.

Automation can make repeated checks easier to execute consistently, but a test still needs an expected result and a meaningful scope. A browser interaction that runs without an error is not automatically proof that the intended outcome occurred; the check must evaluate the behavior that matters. Likewise, rerunning an automated test after a change makes it part of a regression effort only when its purpose is to detect change-induced breakage.

Capturing a web page is evidence, not a functional test

A screenshot can help a developer or reviewer inspect a page’s visual state, but an image alone does not establish that a feature met its specification or that a code change did not break other behavior. It is supporting evidence, not a substitute for checks with expected outcomes. ScreenshotNeo is a website screenshot API and MCP server; it can capture a page for review, but it should not be mistaken for a test runner or a replacement for functional and regression checks.

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

For example, this cURL request captures a target page as a WebP image. It requires a ScreenshotNeo API key; see the ScreenshotNeo API documentation for API details.

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

Or skip the browser setup

ScreenshotNeo accepts cookie or consent banners as a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each of those steps can be turned off. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and responses identify page verdict and billing status in headers. An MCP server provides the take_screenshot, get_page_info, and capture_pdf tools for AI agents using Claude, Cursor, or another MCP client. The Free plan includes 1,000 shots per month without a card; paid plans start at $5 for 3,000 shots.

Sign up for 1,000 free screenshots a month—no card required.

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

Common misunderstandings to avoid

  • “Functional” and “regression” are alternatives. They answer different questions, so one test execution can qualify as both.
  • Regression means rerun every test every time. A regression set can be full or partial; choose cases in light of the change and the behavior at risk.
  • Confirmation of a fix proves nothing else broke. It addresses the reported failure. Regression checks look for side effects elsewhere.
  • Automation makes a test a regression test. The purpose and timing determine whether a check is functional, regression, or both—not whether a person or a tool executes it.
  • A screenshot proves the feature works. A screenshot records appearance at a moment in time; it does not, on its own, verify behavior against a requirement.

How to describe the difference to a team

Use the words “functional check” when you mean “does this behavior match what we expect?” Use “regression check” when you mean “after this change, did behavior that used to work stop working?” If the team is discussing a specific fix, name the confirmation check separately from the regression scope. That vocabulary makes it clearer what a passing run does—and does not—establish.

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

Frequently Asked Questions

Can regression testing include nonfunctional tests?

Yes. Regression describes the purpose of rerunning checks after a change, and a regression set can contain several test types; it is not limited to functional checks.

Should I rerun existing tests after every bug fix?

Rerun existing checks relevant to the changed area and plausible side effects. Whether to run a broader set depends on the change’s reach and risk; the original defect check alone is not broad regression coverage.

Is regression testing a separate phase from functional testing?

Not necessarily. Functional describes the behavior under test, while regression describes the reason for repeating a test after a change. A test may fit both descriptions.

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.

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.