Non-functional testing

In contrast to functional testing, which establishes the correct operation of the software (correct in that it matches the expected behavior defined in the design requirements), non-functional testing verifies that the software functions properly even when it receives invalid or unexpected inputs.

Software fault injection, in the form of fuzzing, is an example of non-functional testing.

Non-functional testing, especially for software, is designed to establish whether the device under test can tolerate invalid or unexpected inputs, thereby establishing the robustness of input validation routines as well as error-handling routines.

Various commercial non-functional testing tools are linked from the software fault injection page; there are also numerous open-source and free software tools available that perform non-functional testing.

Software performance testing and load testing

Performance testing is executed to determine how fast a system or sub-system performs under a particular workload.

It can also serve to validate and verify other quality attributes of the system, such as scalability, reliability and resource usage.

Load testing is primarily concerned with testing that can continue to operate under a specific load, whether that be large quantities of data or a large number of users.

This is generally referred to as software scalability.

The related load testing activity of when performed as a non-functional activity is often referred to as endurance testing.

Volume testing is a way to test functionality.

Stress testing is a way to test reliability.

Load testing is a way to test performance.

There is little agreement on what the specific goals of load testing are.

The terms load testing, performance testing, reliability testing, and volume testing, are often used interchangeably.

Stability testing

Stability testing checks to see if the software can continuously function well in or above an acceptable period.

This activity of non-functional software testing is often referred to as load (or endurance) testing.

Usability testing

Usability testing is needed to check if the user interface is easy to use and understand.It approach towards the use of the application.

Security testing

Security testing is essential for software that processes confidential data to prevent system intrusion by hackers.

Internationalization and localization

The general ability of software to be internationalized and localized can be automatically tested without actual translation, by using pseudolocalization. It will verify that the application still works, even after it has been translated into a new language or adapted for a new culture (such as different currencies or time zones).

Untranslated messages in the original language may be left hard coded in the source code.

Some messages may be created automatically in run time and the resulting string may be ungrammatical, functionally incorrect, misleading or confusing.

Software may use a keyboard shortcut which has no function on the source language’s keyboard layout, but is used for typing characters in the layout of the target language.

Software may lack support for the character encoding of the target language.

Fonts and font sizes which are appropriate in the source language, may be inappropriate in the target language; for example, CJK characters may become unreadable if the font is too small.

A string in the target language may be longer than the software can handle. This may make the string partly invisible to the user or cause the software to fail.

Software may lack proper support for reading or writing bi-directional text.

Software may display images with text that wasn’t localized.

Localized operating systems may have differently-named system configuration files and environment variables and different formats for date and currency.

To avoid these and other localization problems, a tester who knows the target language must run the program with all the possible use cases for translation to see if the messages are readable, translated correctly in context and don’t cause failures.

Destructive testing

Destructive testing attempts to cause the software or a sub-system to fail, in order to test its robustness.