8 minutes
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.
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.
Functional testing usually follows a testing process requiring six steps:
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.
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.
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.
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 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.
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 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.
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.
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 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.
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.
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 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.
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.
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.
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.
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.
Automate software delivery for any application on premises, cloud or mainframe.
Use DevOps software and tools to build, deploy and manage cloud-native apps across multiple devices and environments.
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.
IBM web domains
ibm.com, ibm.org, ibm-zcouncil.com, insights-on-business.com, jazz.net, mobilebusinessinsights.com, promontory.com, proveit.com, ptech.org, s81c.com, securityintelligence.com, skillsbuild.org, softlayer.com, storagecommunity.org, think-exchange.com, thoughtsoncloud.com, alphaevents.webcasts.com, ibm-cloud.github.io, ibmbigdatahub.com, bluemix.net, mybluemix.net, ibm.net, ibmcloud.com, galasa.dev, blueworkslive.com, swiss-quantum.ch, blueworkslive.com, cloudant.com, ibm.ie, ibm.fr, ibm.com.br, ibm.co, ibm.ca, community.watsonanalytics.com, datapower.com, skills.yourlearning.ibm.com, bluewolf.com, carbondesignsystem.com, openliberty.io