My IBM Log in Subscribe

What is functional testing?

2 April 2025

8 minutes

Authors

Phill Powell

Staff Writer

Ian Smalley

Senior Editorial Strategist

What is functional testing?

Functional testing is a software testing approach that verifies whether an application’s features work as expected based on the specified requirements.

In software development, there are numerous types of software testing. Each comes at the task from a slightly different approach. Functional testing most closely aligns with the concept of user experience, and it focuses on one critical question: Do software features work as expected and in accordance with specified requirements?

Software quality is often assessed from various angles as part of the software development life cycle. As far as functional testing is concerned, testers need to validate basic functionality and confirm that software functions capably support business requirements. The test execution involved lets DevOps crews compare actual test results with expected results.

Testing is an essential part of the development process, and functional testing lets QA teams perform a type of quality assurance before the fact, giving them a clear window into how workflows will likely operate when it’s time to launch them for real.

How does functional testing work?

Different operational elements are spotlighted, depending on which type of software testing is being employed as part of the overall testing strategy. Functional testing assesses overall compatibility between different software modules, which has a direct bearing on other related aspects, such as expected user interactions and the viability of the user interface.

The test environment provided by functional testing is considered an example of black-box testing, in which testers don’t gain insight to the inner machinations of the system (as is found in white-box testing)—and are instead given a “Pass/Fail” report on whether the system and its pipelines function as desired.

The six steps of functional testing

Functional testing usually follows a testing process requiring six steps:

  1. Identify the various functions that the software needs to execute.
  2. Create input data according to functional requirements.
  3. Establish expected outputs per functional specifications.
  4. Conduct test cases.
  5. Evaluate how actual outputs compare to expected outputs.
  6. Determine whether the software application works satisfactorily per expectations.
3D design of balls rolling on a track

The latest AI News + Insights 


Discover expertly curated insights and news on AI, cloud and more in the weekly Think Newsletter. 

Types of functional testing

Just as there are varieties of software testing models, there are different types of functional testing. They are numerous, and this is only a partial list of them. Functional testing types encompass a wide range of nuance and are listed here alphabetically.

Ad-hoc testing

In software testing, testers often follow the formal testing process with ad-hoc tests. This informal form of exploratory testing is guided entirely by the testers’ skills and intuition. There’s no defined structure. Instead, the instincts of the testers drive the testing techniques used.

Example: “Buddy testing,” in which a developer and tester join forces and work together on improving a module or app. In this form of ad-hoc testing, the tester usually finds any bugs or other things that need fixing while the developer focuses on making these fixes.

API testing

Application programming interfaces (APIs) enable software development and permit different apps or systems to connect. API testing ensures API points of connection operate as needed. It also provides oversight concerning user permissions and the way data is managed through APIs.

Example: “Headless testing” occurs when there’s a lack of a user interface or user-interface data input field. In such situations, the input data shared with an interfacing service or app can often best be tested through API testing.

Complex test scenarios

Many organizations want their testing process to be truly reflective of the actual experience of real users. For such companies, complex test scenarios provide the desired level of accuracy, although it should be pointed out that greater complexity requires more work up front to execute.

Example: Online order processing only seems like a seamless operation. Behind the scenes, there are plenty of processes to be tested, like how easily items can be added to a shopper’s online cart, how quickly functions like applying discounts are integrated and how smoothly such purchases can be made.

Integration testing

Integration testing is often executed at the same time as unit testing because of benefits like early issue detection and a wider range of test coverage. In addition to helping data formats match up, integration testing provides insight into the workings and performance of microservices.

Example: Let’s say that an order management system is integrated with some type of module that governs payment processing. Integration testing shows where future glitches can occur between the two entities and gives developers a blueprint for fixing integration issues earlier and less expensively.

Regression testing

In a perfect world, once a functional test is passed, it would always pass. But that doesn’t jibe with reality, where software is often impacted by developers who might unknowingly induce errors with new code changes. Regression tests ensure that a steady baseline is maintained.

Example: Any time that code changes are made, one form of regression testing or another is being used. That includes any related updates, as would be made following a bug fix, the introduction of new functionality or after a software update.

Sanity testing

Sanity testing is a fast and agile way to check that existing functionality hasn’t been impaired by the addition of relatively minor changes or bug fixes. Sanity testing tends to be used as a quick way to confirm that new functionality doesn’t trip up the rest of the system functionality.

Example: As with regression testing, sanity testing lets you “rewind” the system to previous functionality in order to verify performance improvements, confirm basic operation and ensure the system is working as expected. Any time code changes are made, one form of regression testing or another is being used. That includes any related updates, as would be made following a bug fix, the introduction of new functionality or after a software update.

Smoke testing

The old saying holds that “where there’s smoke, there’s fire.” This adage appears to have inspired the name “smoke testing.” Smoke testing is conducted early in the development process, and when performed, it judges end-to-end functionality. If functionality fails, QA teams make necessary corrections.

Example: Smoke tests can be used to verify continuous integration and continuous pipelines as a final check before new software builds (or major code changes) can be deployed.

System testing

Sometimes called end-to-end testing, system testing works to assess how the software of an entire software system operates together. System testing often involves the analysis of multiple separate software systems that may or may not work in unison within a particular software system.

Example: End-to-end scenarios allow testers to assess complete workflows. For online retail operations, this could mean the entire retail experience that the consumer experiences, from the original purchase order through the entire fulfillment process.

Unit testing

Unit testing is a form of testing in a microcosm. Here, we’re not testing an entire system, only a limited piece of code. A section of code is evaluated in an isolated testing environment, and if the unit test fails (based on a comparison of test data against functionality goals), more testing can be undertaken on a system-wide level.

Example: Fairly basic computational elements are tested well via unit testing. Consider a simple function that converts Celsius temperatures to their Fahrenheit counterparts. The test environment contains the code in question and the test cases involved.

User acceptance testing

As a later stage of software testing, user acceptance testing seeks to incorporate and learn from performance testing as conducted by the people who represent the intended demographic of the software being produced. These end users bring added realism to the test process.

Example: A user of a software plan upgrades to their next service tier, entitling them to unlock entire new functionality. User acceptance testing verifies that the user will be able to see their access to features increase as expected.

IBM DevOps

What is DevOps?

Andrea Crawford explains what DevOps is, the value of DevOps, and how DevOps practices and tools help you move your apps through the entire software delivery pipeline from ideation through production. Led by top IBM thought leaders, the curriculum is designed to help business leaders gain the knowledge needed to prioritize the AI investments that can drive growth.

Functional testing vs. non-functional testing

As its name implies, non-functional testing evaluates application behaviors that aren’t usually considered vital to ensure functionality. Nonetheless, delivering a well-organized and pleasant user experience is now considered an essential part of software development. Non-functional testing can reveal potential system problems, especially when the software is maximized to demonstrate greater scalability.

Load testing

Load testing is one key form of non-functional testing. In theory, a system should be able to process thousands of system requests with the same sense of urgency as it dispatches a single system request. However, that logic isn’t supported by realistic experience. Load testing works to see if systems can handle peak loads and even extreme workload spikes.

Performance testing

Another form of non-functional testing pays special attention to performance. It’s critical to good performance that a system responds to requests in a smooth and quick manner. The test plan in performance testing evaluates how long users have to wait for their requests to be processed. When created thoughtfully, performance tests can help minimize latency early on.

Security testing

Given the importance of data security, it’s unsurprising that one form of testing would cater specifically to this most modern cause. Security testing methodologies like Dynamic Application Security Testing (DAST) and Static Application Security Testing (SAST) help testers check for security vulnerabilities. Company security testing methods are selected according to potential threats.

Usability testing

One non-functional testing type is completely about the quality of the user experience (UX). Usability testing is a manual testing process that’s best used on a small scale. Nonetheless, it should be applied whenever possible—especially when executing moves like localizing applications, which can be fraught with peril when introducing complexities that can trigger human error.

Functional testing tools

Keeping accurate track of all the various functional testing tools can take work since most support different platforms and types of applications. Although there’s no way to keep up with this burgeoning marketplace—estimates easily run into the hundreds and perhaps even thousands of functional testing tools produced—here’s a handful that stand out for their proven popularity and acknowledged utility.

  • Appium: The functional testing marketplace boasts many open-source tools, with Appium leading the list. Appium provides support for multiple programming languages. Further, Appium lets you automate native, mobile web and hybrid applications for both the iOS and Android platforms.
  • Katalon Studio: Test automation platform Katalon Studio offers a means for establishing and evaluating results generated through regression testing and end-to-end testing. It features a record-and-playback function and cross-platform coordination.
  • Micro Focus Unified Functional Testing (UFT): Micro Focus’s UFT is another commercial testing tool, this one giving testers a clear, multi-platform window into the use of web services, Application Programming Interfaces (APIs) and Graphical User Interfaces (GUIs).
  • Playwright: Microsoft developed this commercial framework for the automation of web browsers. It’s known for reinforcing reliability. And although Playwright does support contemporary web features, it offers fewer options for dealing with programming languages.
  • Selenium: One of the most popular test automation tools is Selenium, which is an open-source framework. This browser-based tool allows testers to write and evaluate test scripts in a variety of popular programming languages—including JavaScriptTM, NodeJS and Python. 
Related solutions

Related solutions

IBM DevOps Accelerate

Automate software delivery for any application on premises, cloud or mainframe.

Explore DevOps Accelerate
DevOps solutions

Use DevOps software and tools to build, deploy and manage cloud-native apps across multiple devices and environments.

Explore DevOps solutions
Cloud consulting services 

Unlock new capabilities and drive business agility with IBM’s cloud consulting services. Discover how to co-create solutions, accelerate digital transformation, and optimize performance through hybrid cloud strategies and expert partnerships.

Explore cloud services
Take the next step

Unlock the potential of DevOps to build, test and deploy secure cloud-native apps with continuous integration and delivery.

Explore DevOps solutions Discover DevOps in action