What is functional testing?
Functional testing is a collection of software quality testing methods used to validate that a software or hardware product meets predetermined requirements or business scenarios. Typically, this is a “black-box” process performed by Quality Assurance (QA) professionals or development teams.
This means the tester feeds inputs into a system, feature, or functionality and examines the outputs, which are used to evaluate the compliance or acceptance of the product or feature. Specifically, functional tests are unaware of—and decoupled from—the underlying implementation of the system.
Why is functional testing important?
In earlier stages of testing, like unit testing or integration testing, test cases are more likely to isolate or mock certain parts of the system. This “white-box” approach allows automated test suites to run much faster, but it also creates gaps in test coverage.
In contrast, the objective of functional testing is to ensure the end product actually works according to specifications and meets user acceptance criteria. By performing these tests under “black-box” conditions, functional testing shores up the coverage gaps common to other testing methods. The resulting products are likely to be higher quality and produce fewer issues for customers.
Some of the benefits of functional testing include:
- Better customer satisfaction
- Fewer support calls
- Less churn or product returns
- Higher product and feature adoption
- Fewer error rates
Who does functional testing?
Functional testing is most commonly managed by QA teams, more specifically test engineers or QA testers. Sometimes developers and product team members may take on specific types of functional testing. There are also specific functional tests that require customers or external members to perform testing.
Relationships with other types of testing
There are many types of testing that either are functional tests or are related to functional testing. These include:
- Unit testing: Unit tests validate the specific functionality of smaller “units” of software, such as a function, method, or class. They’re typically created by developers and run automatically to ensure that the input to a unit will produce the desired output. Unit tests for simple functionality often share characteristics with functional testing, but unit tests that depend on stubbing or mocking other parts of the system aren’t functional tests.
- Integration or Component testing: These tests are similar to unit tests, but focus on testing multiple components or groupings of code from different parts of an application or system. Typically this testing is done in isolation from other components or the general system. As such, it’s often not a purely functional form of testing. But between the specific components under test, it’s often performed in a “black-box” style like functional testing..
- UI testing: UI testing specifically focuses on UI functionality like buttons, text, menus, icons, notifications, and toggles—usually scripting complete user activities like submitting a form. These tests can be performed by QA teams or even automated with tools like Selenium. If the tests are run without isolating the UI from other dependencies, they can be considered a form of functional testing.
- Smoke testing: Smoke tests (sometimes called verification tests) are an initial check of the core features and functionality of a product. They’re usually performed as a pre-check for issues severe enough to halt a release right away. As such, smoke tests can be considered a subset of functional testing.
- Regression testing: QA teams perform regression tests to verify continued functionality of previously tested systems, so new features or improvements don’t introduce issues to existing functionality. It can be useful for regression tests to be “black-box” functional tests, since tests that are tightly coupled to implementation can sometimes mask regressions. But regression tests for smaller edge cases will often be handled as unit tests, since they’re much faster.
- Acceptance testing: Acceptance testing aligns each test case with specific “acceptance criteria” for the functionality of the system that are established prior to development—preferably through discussions with real users. This helps ensure that the product truly meets the requirements of its users. Acceptance tests are frequently functional tests, but might not be if implemented as more “white-box” unit or integration tests (as they may be in Behavior-Driven Development).
- User testing: User tests—like alpha, beta, and delta tests—can be considered a form of functional testing. They’re all “black-box” tests, since the users can’t alter the underlying software or hardware while testing. However, by testing with real users in real environments, these tests provide even more realistic and useful feedback than functional tests performed in a QA environment.