Non Functional Testing Types: Tutorial & Best Practices

April 21, 2024
14
min

Quality assurance for modern software products involves more than simply delivering bug-free applications. Beyond testing core functionalities, non-functional testing ensures that a software application provides an optimal user experience, even when subjected to the unpredictable realities of the digital world. It includes diverse evaluations that validate performance, usability, reliability, security, and more.

This article discusses several non-functional tests, including their objectives, best practices, and associated challenges.

Functional vs non-functional testing objectives and types

Summary of key non-functional testing concepts

Test type Description
Stress Evaluates the stability and reliability of a system, application, or component under extreme conditions.
Load Assesses a system's behavior under specific load conditions, such as expected or peak load.
Performance Measures system characteristics under typical load conditions, such as responsiveness, speed, reliability, and scalability.
Scalability Determines a system's ability to scale up (vertical scalability) or scale out (horizontal scalability) in response to increasing or decreasing load.
Volume Evaluates how a system handles a large amount of data and whether the system can efficiently process, store, and retrieve data.
Security Discovers vulnerabilities or weaknesses in a system that malicious users or attackers could exploit.
Compliance Verifies that a system meets the requirements of regulatory bodies, industry standards, or internal policies.
Usability Identifies usability issues and gathers feedback from users to improve overall user experience.
Compatibility Helps ensure that software provides a consistent user experience across various platforms, such as different devices, browsers, and operating systems.

The following sections explore the nine non-functional testing types, followed by best practices and challenges associated with each.

#1 Stress testing

Stress testing measures the software's performance under extreme load conditions and specific stress scenarios, pushing it beyond normal operational limits. For example, sending many simultaneous requests to evaluate server response times or running resource-intensive operations to test a specific application feature. Two common stress test scenarios include:

  1. Simulating a sudden influx of concurrent users (“spike testing”)
  2. Generating excessive data loads.

Stress testing helps identify potential failure points in the system. It also assesses the system’s ability to handle high or unusual load patterns relative to its expected operating capacity.

Stress testing best practices

Include gradual ramp-up

Do not overload the system immediately. Begin with moderate stress and gradually ramp up the load to observe how the system behaves under increasing pressure. This allows you to pinpoint specific thresholds where performance degrades or failures occur. You can uncover issues you might miss if the system receives more traffic within a short time frame.

Simulate real-world scenarios

Go beyond simply overloading the system. Simulate real-world disruptions like server crashes, network outages, or denial-of-service attacks to assess the system's resilience and recovery capabilities.

Define proper rollback strategies

Stress testing might push the system to its limits, potentially leading to data loss. Mitigating this risk requires a comprehensive data backup strategy. Before commencing stress tests, regularly create full backups of your system's data. Store these backups securely in a separate location or in the cloud to ensure they are not affected by any incidents that might occur during the test.

#2 Load testing

Load testing assesses a system's behavior under expected and peak load conditions by measuring response times, throughput, and resource utilization. For example, you can simulate many users interacting with an e-commerce website during a flash sale. It helps determine the system’s breaking point (i.e., the point at which it no longer operates within acceptable tolerances).

{{banner-2="/design/banners"}}

Load testing best practices

Set realistic expectations

Accurately predicting real-world user load patterns takes time. To establish realistic load scenarios for testing, utilize historical usage data, user behavior analytics, and industry best practices.

Isolate microservice performance

Modern systems frequently have numerous microservices that interact with each other in complex ways. Tools like service virtualization (or service mocking) can simulate the behavior of dependencies. In addition, load testing each microservice in isolation provides insights into how the performance characteristics of an individual service impact the application as a whole.

In many cases, testing components in isolation can be combined with end-to-end load tests of the entire system (or larger subsystems) to help determine whether performance issues stem from an individual system component or are the product of the inter-component interactions.

Provision and maintain testing infrastructure

Traditional load testing approaches often rely on provisioning a dedicated infrastructure for generating load. This requires acquiring and managing hardware, licensing and configuring testing tools, and ongoing maintenance, all of which can be resource-intensive for development teams. These limitations can constrict the scope of load testing due to budgetary or time constraints.

Cloud load testing solutions like Multiple address this challenge by providing on-demand infrastructure designed for generating load and executing load tests.  Unlike traditional environments, Multiple eliminates the need for dedicated hardware or software management. It also offers functionalities beyond just load generation, such as secure storage for test scripts/results, support for integration with package managers like NPM, and role-based access control.

Choose the right tool

A significant hurdle in load testing is that some testing tools require developers to use proprietary scripting languages. It can introduce a learning curve and slow the testing process. Utilizing a load testing tool that supports writing test scripts in a familiar scripting language saves time and allows developers to write tests similar to application code. For more considerations, check out our guide to the must-have features for load testing tools.

User interface of the Multiple load testing platform, which uses JavaScript as its scripting language (adapted from source)

#3 Performance testing

Performance testing evaluates a system's overall responsiveness, speed, and stability under “normal” conditions. It provides insights into the application's performance under reasonable or expected workloads, such as measuring a database query's response time or assessing a web page's rendering speed.

Performance testing often involves benchmarking and setting performance criteria such as response time and error rate. For example, in a healthcare application, performance testing could determine typical response times when the system performs a resource-intensive operation, such as processing a large patient record with numerous attachments. Test results can be used to determine whether a system performs within acceptable limits and complies with SLAs. You can also compare the results of earlier performance tests with those from subsequent tests to evaluate the performance impacts of application code or infrastructure changes.

Performance testing best practices

Define performance goals

Establish performance objectives from the outset. What are your acceptable response times? What resource utilization thresholds should not be exceeded? Well-defined goals guide test design and data analysis and determine success criteria. Clarity helps stakeholders understand what to expect from the system and provides precise information for developers writing tests.

For example, a clear non-functional requirement could state: "The system should maintain response times below 2 seconds with 1000 concurrent users during peak usage." This requirement clearly outlines the expected response time (below 2 seconds) and the context (when 1000 concurrent users access the system).

Prioritize testing business-critical functionality

Many organizations find it unrealistic to conduct comprehensive performance testing of every aspect of an application. In these cases, shifting the focus towards sections or modules with high business impact is vital. Identify and address performance bottlenecks that hinder critical user interactions or high-risk areas of the system, such as a checkout process or authentication/authorization processes. The high-risk areas and critical user interactions vary depending on your application or system.

Store test results centrally

Cloud-based performance testing tools often offer centralized storage for test scripts, configurations, and results. The centralized approach simplifies data organization, retrieval, and analysis for authorized users. In addition, choosing a tool that supports Role-Based Access Control (RBAC) ensures this central repository remains secure by controlling who can access and manage the stored data.

#4 Scalability testing

Scalability testing evaluates a system's capacity to manage growing and shrinking workloads.

  1. Testing upward scalability (or ramp-up testing) determines whether a system has the necessary configuration and available computing resources to respond to surges in traffic.
  2. Testing downward scalability (or scale-down testing) assesses the system's capacity to scale down resources during reduced-demand periods, ensuring efficient resource utilization and cost-effectiveness.

Testing both is essential to ensure consistent performance and prevent unnecessary operational costs, particularly for systems that rely on cloud resources and autoscaling.

If your system is experiencing significant user growth, scalability testing helps determine if the infrastructure can keep up. It is especially important for applications like social media platforms, ecommerce websites, or other platforms anticipating a continuous influx of new users. Another scenario where you should consider scalability testing is shortly before rolling out a new feature with a high potential for user engagement.

There are two common approaches to scaling a system: horizontal scalability and vertical scalability.

Horizontal scalability

Horizontal scalability refers to a system's capacity to expand by adding identical nodes or instances to a distributed architecture. The primary goal is to assess how well the system distributes the workload across multiple nodes, ensuring that adding new instances improves performance. It includes evaluating load balancing mechanisms, data synchronization, and the system's ability to maintain consistency across distributed components.

Vertical scalability

Vertical scaling involves enhancing the capacity of an individual node by adding more resources such as CPU, memory, network speed, or storage to an existing server. This approach often means upgrading a server's hardware or provisioning additional resources to a virtual machine. When testing vertical scalability, the primary concern is determining whether a system node can sufficiently handle increased load. If not, you may need to increase the node’s computing resources or redesign the system to scale horizontally.

Vertical vs horizontal scaling (Source)

Scalability testing best practices

Define scalability goals

Clearly define what scalability means for your system, such as the expected number of concurrent users, transactions per second, or data volume. Will these goals require the system to scale horizontally or vertically? What performance benchmarks do you want to achieve?  Having well-defined goals helps design targeted test scenarios and evaluate success criteria.

Test different cloud configurations

A common use case for scalability testing in cloud-based systems is determining the viability and cost of different resource configurations. It helps determine which cloud resources–such as VM or container instances, storage solutions, or networking services–are necessary for your application.

Utilize a proper test environment

A test environment used for scalability testing might not perfectly replicate the production environment. While having an identical environment is not always feasible, strive to get as close as possible to production to ensure meaningful test results. Utilize infrastructure as code (IaC) tools to automate the provisioning and configuration of testing environments and ensure consistency with the production environment.

#5 Volume testing

Volume testing evaluates a system's performance when handling large volumes of data, focusing on the system’s storage, retrieval, and processing capabilities. It helps identify potential bottlenecks and limitations associated with data management, often related to database performance, file storage capacity, and data processing efficiency.

Volume-testing scenarios include uploading many documents to a document management system, evaluating a database's performance with a substantial number of records, or simulating many concurrent users.

Volume testing best practices

Choose representative data sets

It's crucial to utilize data sets that realistically reflect the type and volume of data the system encounters in production. Using unrealistic data can lead to misleading test results.

Optimize data management strategies

Volume testing can expose inefficiencies in storing, retrieving, and processing data. The testing process can help identify opportunities to optimize database queries, improve data indexing, or implement caching mechanisms to enhance performance when dealing with large data volumes.

#6 Security testing

Security testing is critical to ensuring the robustness of a system's defenses against potential cyber threats. This non-functional testing type aims to identify vulnerabilities, weaknesses, and possible security risks within the system's architecture, codebase, or configuration. Security testing should be ongoing to ensure the system remains protected against emerging threats.

SQL injection attack simulation

Simulating a SQL injection attack on a web application involves attempting to inject malicious SQL queries through input fields to exploit potential vulnerabilities in the database layer. For example, entering crafted input such as ' OR 1=1; – in a login form may allow an attacker to gain unauthorized access to a system. The snippet attempts to make the query always true, bypassing any login conditions and allowing unauthorized access to the system. In SQL injection attacks, the goal is to manipulate the input fields to alter the SQL query executed by the application's database.

Penetration testing

In penetration testing, testers systematically attempt to exploit vulnerabilities in a controlled environment. They use various techniques to gain unauthorized access, escalate privileges, or uncover weaknesses in the system's security posture.

Penetration testers often look for misconfigurations or unnecessary open ports during their assessments. For example, they exploit misconfigured services or find ways to gain unauthorized access by taking advantage of open ports running outdated or vulnerable software.

To mitigate these risks, system administrators must regularly review and update firewall rules, close unnecessary ports, and keep software and services up-to-date with the latest security patches. Additionally, you can employ network security measures such as intrusion detection systems (IDS) and intrusion prevention systems (IPS) to monitor and respond to potentially malicious activities on the network.

Security testing best practices

Mitigate false alerts

It is important to note that security testing tools may generate false positives (indicating vulnerabilities that do not exist) or false negatives (missing actual vulnerabilities). Human expertise is crucial to interpreting results accurately, prioritizing issues, and conducting in-depth analyses beyond automated scans.

Prioritize vulnerabilities

Security testing can often uncover a multitude of vulnerabilities. A critical challenge lies in effectively prioritizing these vulnerabilities based on the severity of their risk and the likelihood of them being exploited.

{{banner-1="/design/banners"}}

#7 Compliance testing

Compliance testing is a systematic process to ensure a software system aligns with established regulatory and industry-specific standards. These standards often include legal requirements, security protocols, and industry best practices. The primary goal of compliance testing is to verify that the system addresses concerns related to data security, privacy, and ethical considerations.

While there is an overlap with security testing in this case, each industry has its own set of compliance procedures to adhere to (and uses different tools and methods). For example, compliance testing validates that healthcare applications align with the Health Insurance Portability and Accountability Act (HIPAA) or ecommerce applications with the Payment Card Industry Data Security Standard (PCI DSS). Each has its own regulations with specific monitoring requirements to ensure data privacy, financial integrity, and overall system reliability.

Compliance testing best practices

Understand regulations

Keeping up-to-date with ever-changing regulations is a challenge. Maintaining a clear understanding of the specific regulations and standards that apply to your system is essential.

Maintain documentation

Compliance testing often requires maintaining comprehensive documentation to demonstrate adherence to relevant standards. Establish clear processes for documenting test procedures, results, and any identified non-compliance issues.

Implement continuous monitoring

Compliance is not a one-time achievement. Ongoing monitoring is essential to ensure the system remains compliant, especially when introducing new features or functionalities. Developers need to continuously monitor for vulnerabilities in the system and applications using vulnerability scanning tools such as OpenVAS (to identify potential security flaws within the system’s infrastructure).

You can also use configuration management tools like Ansible or Chef to automate configuration management and track changes.

#8 Usability testing

Usability testing evaluates how user-friendly and intuitive a software application is in terms of its design, interface, and overall experience. The primary goal is to understand how easily users can interact with the system, accomplish tasks, and navigate different features. It strongly emphasizes the human-computer interaction aspect of the software and relies on feedback from real users interacting with the software product.

Usability testing can occur during different phases of the design or development processes, such as:

  • During the design phase, user feedback determines the viability of different designs, wireframes, or prototypes.
  • During the development phase, users test an application's functional prototypes or beta versions.
  • Users identify any last-minute issues that need to be addressed before launching a new product or feature.
  • Post-launch users identify areas for improvement for future iterations of the product.

Challenges in usability testing

Subjectivity

Usability testing results can be subjective due to user perceptions and preferences.  One user's intuitive experience might differ from another's. To address this, balance qualitative insights (user feedback) with quantitative data (user interaction analytics).

Limited context from user surveys

Surveys are valuable for gathering direct user feedback on interface clarity, feature discoverability, and overall satisfaction but often need more context. A user reporting difficulty with a feature might not elaborate on the specific confusing steps. This limitation necessitates using usability testing methods that provide context, such as user interaction analysis.

Evaluating accessibility

A crucial aspect of usability testing is assessing website or application accessibility for individuals with disabilities. It ensures compliance with accessibility standards like the Web Content Accessibility Guidelines (WCAG). There are multiple ways to evaluate a system’s accessibility:

  • Utilize automated testing tools and occasionally run accessibility test plans. Maintain and update the test plans accordingly upon any UI modifications.
  • Rely on manual testers with assistive technologies like screen readers, keyboard navigation tools, or voice control software.
  • Conduct usability testing sessions with individuals representing various disabilities.

These sessions allow users to highlight areas of difficulty and suggest improvements for a more inclusive user experience.

#9 Compatibility testing

Compatibility testing ensures a software application functions correctly across browsers, devices, and operating systems. It is crucial to guarantee a consistent user experience regardless of the environment.

  • Cross-browser compatibility tests that features work as intended, and no layout or functionality issues are specific to a given browser.
  • Device compatibility ensures that a mobile app's design, functionality, and performance are consistent across various devices.
  • Operating system compatibility tests the application's installation and integration with various operating system components.

The ever-growing number of browsers, devices, and operating systems makes it challenging to prioritize testing scenarios and ensure comprehensive testing within resource constraints.

Challenges in compatibility testing

Emulator limitations

Emulators and simulators are often used in compatibility testing. They preclude the need to purchase different devices and run tests on various platforms. However, they may only partially replicate real-world device behavior, potentially missing compatibility issues. To mitigate this, consider running tests on a subset of real devices.

User preferences

While compatibility testing ensures a baseline functionality across platforms, it does not guarantee an optimal user experience. Consideration should be given to user preferences and interaction patterns on different devices (e.g., touchscreens vs. keyboards).

{{banner-1="/design/banners"}}

Conclusion

Non-functional testing types are not merely a checkbox in the software development process but a strategic imperative. They align technology with user expectations and business goals. By analyzing performance, usability, reliability, security, and more, non-functional testing provides valuable insights into application behavior under various circumstances. We hope the information and best practices presented in this article will help your team integrate non-functional testing more effectively into your current and future software projects.