9 minute read time

Types of Software Testing: Functional & Non-Functional

by in DevOps Cloud (ADM)

software-testing.pngSoftware testing, whether manual or automated, is a key quality assurance process in application lifecycle management. It helps testers, developers, IT operations, project owners, business analysts, and end users determine that a system satisfies the stated project requirements. There are dozens of software testing types you could run on an application.

Nevertheless, these tests fall into two broad categories: functional testing and non-functional testing. We’ll take a closer look at these two categories as well as examples of the types of software testing found within these two categories.

Functional Testing 

Functional testing seeks to determine whether an application feature works exactly as set out in the project’s functional requirement specification.

A functional requirement is one that describes what the application should do when fed certain inputs. It describes the software’s behavior when a given input condition is satisfied. This could be, for example, automatically sending out a confirmation email when new users sign-up to a service. Functional requirements include business procedures, transaction rules, user authentication, user authorization, audit trails, reporting requirements, regulatory compliance, and interfaces with other applications.

Functional tests are conducted by crafting several test cases, preparing test data, feeding the test data into the application and checking whether the actual output is identical to the expected result. The overwhelming majority of functional testing types are considered forms of black-box testing. That’s because the tester has no concern about the code-level structure and internal workings of the application. This contrasts with white box testing where the focus is on the inner workings of the system.



Types of Software Testing: Functional Testing 


So, what are some examples of types of functional testing?

Smoke Testing 

Smoke testing is a quick, elementary, and high-level test that’s a precursor to more extensive QA testing. It’s usually performed by a developer or tester, immediately after a build is completed or after it’s deployed into production. A smoke test confirms that the build is stable, and its core features are working.

The rationale for smoke testing is that there’s no point in subjecting a build to rigorous testing if its most critical functionality is broken. So if a build fails the initial smoke test, it’s rejected, and the development team is advised to make changes accordingly.

Sanity Testing 

A sanity test is typically performed by a tester, after the smoke test. It checks that the major capabilities in the build are present and working as expected, and are ready for further, more in-depth testing. Sanity tests go into more detail than the smoke test but is still one of the types of software testing that is considered minimal and basic.

The tester would, for instance, confirm whether the result of a calculation is correct or if the application’s menus are working fine.

Unit Testing 

Agile development often involves different teams working on various modules of an application at the same time. It can be said that unit testing is the functional test that occurs closest to the application code. Unit tests focus on the smallest component, or unit, of an application, and the tester, who is usually a developer, knows and understands the unit’s internal structure and design. For that reason, unlike most functional types of software testing, it’s classified as white-box testing.

The test evaluates the individual components of the build to confirm that each is working as expected. Unit testing precedes integration testing, and due to the detailed knowledge of the module needed, unit testing is usually done by the component’s developers as opposed to the testers.

Because unit testing is done at the beginning stage of the development process, any defects detected are usually easy and cheap to fix.

Integration Testing 

While unit testing may confirm that each module works flawlessly on its own, that’s no guarantee that it will necessarily work when integrated with the other modules of the application.

Integration testing confirms that the combined parts of the application work as well as (or better than) the individual components. It seeks to expose defects and conflicts in the interaction between the various units.

Regression Testing 

Regression testing checks that, following a code change, such as a bug fix or the introduction of a new feature, a build has not taken one or more steps back on its functionality. It’s run whenever there’s a modification to a module, group of modules, or the entire build.

This is an especially important test in the agile methodology, since the application is built incrementally. There’s an ever-present risk that the introduction of new features could negatively affect an existing function or create new bugs, and these issues should be detected as early as possible.

Regression testing can be performed manually, but given the number of features that must be tested, regression testing should be automated as much as possible. Automated regression tests can be scheduled to run every night, effectively replacing hundreds of manual testing hours with a few hours of automated testing.

Defects found at this stage are less costly to fix than defects that escape into production. For this reason, testing contributes not only to application quality, but also to cost savings.

Localization Testing 

Localization testing confirms that the build can be customized to the tastes and preferences of different types of users, different geographical locations, different languages, and different devices.

For instance, an application’s English language setup may run well but perhaps the German language setup doesn’t. Testers verify that the build conforms to custom user requirements and that localization efforts don’t lead to breaks in functionality.

User Acceptance Testing 

User acceptance testing (UAT) subjects the application to a simulated, real-world user environment. Unlike most other types of software testing, UAT is conducted by the system’s intended end users. It checks that the software’s management of business processes is at an acceptable level.

The test occurs in an environment that’s a near replica of the production environment. UAT is one of the last activities that occur before the build is deployed to production. It takes place after all key defects of the application have been resolved.

Non-Functional Testing 

Whereas functional testing deals with what the application does, non-functional testing checks how well the application runs in order to identify areas of improvement. Non-functional requirements are a part of the project’s specifications and define the operational characteristics and limits of the system.

An example of a non-functional requirement is ensuring that any update to a shared database is visible to all users within 3 seconds. Non-functional testing looks at, among others, the application’s usability, throughput, response time, capacity, scalability, reliability, maintainability, recoverability, security, integrity, and interoperability.

Types of Software Testing: Non-Functional Testing 

There are at least a dozen types of non-functional testing types. Let’s look at the most important ones.

Performance Testing 

Performance testing examines various aspects of the capability and quality of the application. Performance is a broad term and includes speed, efficiency, effectiveness, scalability, reliability, stability, and other technical elements around the working of the system.

For that reason, some of the non-functional types of software testing we cover below, such as stress testing and load testing, are considered forms of performance testing.

Usability Testing 

Usability testing examines the application’s navigation, logical flow, intuitiveness, user-friendliness, and content, as well as how easily a new user can understand its operation. That includes checking that the system’s online and offline documentation is sufficiently helpful for users who get stuck.

Security Testing 

Security testing investigates the ability of the application to withstand a malicious attack and protect its data. The testing would at the minimum cover user authentication, authorization, non-repudiation, role-based access, audit trails, password encryption, and automatic logoff after a specified period of inactivity.

The testing is best done by highly skilled security experts who have a deep understanding of the various loophole’s attackers could exploit to penetrate an application.

Volume Testing 

In volume testing, the application is subjected to large data volumes to gauge its response times, processing times, reliability, accuracy, and overall system behavior under such circumstances. Volume testing is also referred to as flood testing and is considered a subset of performance testing.

Scalability Testing 

Scalability testing is a form of performance testing that evaluates the software’s ability to grow in tandem with the increasing demands of the system’s end users and data. It checks that the application can scale up or out as required up to the desired threshold.

Load Testing 

Load testing is a type of performance testing that determines the maximum load that the application can handle without experiencing a degradation in performance. For instance, how many simultaneous logins or concurrent users can the system support? During the test, the load is increased continuously until it reaches the limit as stated by the development team. Given the nature of this test, it’s almost exclusively done via automated tools.

Stress Testing 

Stress testing is a type of performance testing and is more extensive than load testing. It pushes the system to its limits by subjecting it to extreme loads well beyond the application’s specifications that could occur during extraordinary circumstances.

It investigates how hard the system can be pushed before it breaks. Stress testing also evaluates the recoverability and error handling of the system after a crash occurs. It tests whether recovery happens without jeopardizing the security and integrity of application data.

Recovery Testing 

Recovery testing often goes hand in hand with stress testing. It checks the system’s ability to protect and recover data in the event of a system crash, hardware failure, power loss or network disruption. The system is forced to fail, and the tester establishes whether the application can be brought back up unscathed.

Configuration Testing 

While the requirements specification may outline the hardware and software environment the application should operate in, it doesn’t specify the type and model of infrastructure it will be installed on. Configuration testing studies whether the application performs consistently when setup and configured for different types of hardware, browser, operating system, and drivers.

It’s virtually impossible to run tests for every platform scenario. Ergo, configuration testing must focus on platforms that already exist in the production environment.

Final Thoughts on Types of Software Testing 

Testing confirms that the application meets or exceeds the expectations of project owners, end users, IT department, and the organization’s senior management. Though different from one another, both functional and non-functional types of software testing are a critical component of ALM.

Micro Focus delivers a number of tools for functional and non-functional software testing. Click on the links to learn more:

Additional information

  • Have technical questions about the UFT Family? Visit the Discussion Forums for UFT One, UFT Developer, UFT Mobile, and Service Virtualization.
  • Keep up with the latest tips and information about UFT One, UFT Developer, UFT Mobile, and Service Virtualization.
  • Do you have an Idea or Product Enhancement Request for the UFT Family? Submit it in one of the Idea Exchanges for UFT Developer, UFT Mobile, and Service Virtualization.

We’d love to hear your thoughts on this blog. Comment below.


Application Lifecycle Management
Application Lifecycle Management
  • Hi Nick,

    I hope this message finds you well.
    I gotta hand it to you for diving deep into the software testing realm—your take on both functional and non-functional testing was legit. Your breakdown of testing types, like smoke testing and sanity testing, totally vibes with my software development hustle. It really hits home how crucial early defect detection is, especially when we're talking unit testing.

    I wanted to contribute to the conversation by suggesting the inclusion of security testing early in the development cycle. In my projects, involving security experts from the beginning has proven invaluable in identifying vulnerabilities that might otherwise be overlooked. Given the crazy rise in digital dangers, adopting this proactive security stance could be a total game-changer.

    Additionally, I've found that incorporating actual end users in the User Acceptance Testing (UAT) phase for usability testing ensures not only the meeting of technical requirements but also alignment with user expectations.

    Your detailed exploration of performance testing, scalability testing, and load testing is spot-on. People often sleep on these factors, but trust, they're the real MVPs for making sure your user experience stays smooth. Especially in today's wild digital jungle, you gotta give props to these often overlooked aspects – they're the secret sauce to keeping things on fleek.

    By the way, I stumbled upon this article titled 'AI In Software Testing: Extract The Benefits For Your Business' It's a game-changer, giving you a whole new take on how to milk the benefits of AI in software testing. Check it out if you want to level up your testing game! I thought it might complement the discussions we've been having. Feel free to check it out when you have a moment.

    Thanks a bunch for dropping those brain bombs!