Creating a new software product is just half the battle, making sure it performs to the high standards customers demand is equally- and arguably more – important. You must thoroughly test the product’s performance.
Testing is a key role performed by quality assurance. In software development, software testing involves different techniques to ensure reliability and smooth performance of the software. Furthermore, testing ensures software stability for future maintenance and modifications.
According to the International Software Testing Qualifications Board, the 4 main types of software testing are:
- Functional Testing
- Non-Functional Testing
- Structural testing
- Change related testing
Below we discuss these 4 testing types along with their sub-categories:
1. Functional Testing
This method tests the functionality of software by mainly focusing on the application. Testing is performed to ensure that the software works to fulfill business as well as customer requirements. These tests can be executed both ways; through manual and automated testing.
Steps involved in functional testing are as follows:
- Identifying the requirements of end-users.
- Functions that the software is required to perform are defined as inputs.
- Depending upon those inputs, expected results are defined.
- Test cases are executed.
- Expected results are compared with actual results.
- The differences are documented as defects.
Types of Functional Testing:
a) Unit Testing
In unit testing, testers (or the developers themselves) check details of the software by examining the units. Each unit, i.e. the smallest testable piece of code is subjected to testing by either the software developers themselves or by independent testers. Since it is the 1st level of software testing, the cost of fixing errors found using this method is low.
b) Integration Testing
Testers check the software by combining individual software modules to make sure that they work correctly as a group. This testing is essential to verify that all the units work correctly when connected. It also ensures efficiency of the software.
c) Smoke Testing
Also known as ‘Build-Verification Testing’, smoke testing is performed to determine if the software should be subjected to further testing. All functionalities are tested in this case, but not in a great deal of depth. It is a stability system test that is performed on the software-build.
Smoke testing requires a limited number of test cases and is not too time-consuming.
d) Sanity Testing
Sanity testing is performed to check rationality of the system. It is performed when any change in functionality takes place or when a bug is fixed. It is unscripted and is a subset of Regression Testing. Also, it ensures the correct working of functionality after a minor change.
e) Interface Testing
Interface testing is done to check user-friendliness of the system. It tests the interfaces between systems and components, e.g. web server & application server interface, and application server & database server interface.
f) System Testing
System testing tests the complete integrated software to verify if it meets the specified requirements and expectations. It is the 3rd level of software testing and covers complete end-to-end testing.
g) User-acceptance Testing
Also known as beta-testing, user-acceptance testing is done by making the intended audience deploy the software. The focus is on identifying flaws in system functionality from the end-users’ viewpoint. In this case, real-time feedback is obtained directly from the end-user, helping with elimination of errors at the beta stage.
2. Non-functional Testing
This testing method focuses on non-functional requirements of the system e.g. usability and reliability. It deals with matters such as security of the application, performance on different operating systems, or when many users log into the system.
Types of Non-Functional Testing:
a) Reliability Testing
This type tests if the system meets all the customer’s reliability requirements. According to ANSI, reliability is, “The probability of failure-free software operation for a specified period of time in a specified environment.”
Reliability testing guarantees the consistency in performance of the system.
b) Usability Testing
Here the product is tested on real users. Testers then observe users while they use the software to figure out usability issues. It is performed to ensure that the product is easy-to-use. This testing helps identify real-user issues by getting feedback and reviews of the target audience.
c) Security Testing
As the name suggests, this method checks the security mechanisms of the system to look for any loopholes or weaknesses that can result in the vulnerability of the software. This method provides security against privacy breaches and ensures the confidentiality and protection of data.
d) Compatibility Testing
Compatibility testing is performed to see if the software is compatible with different browsers, operating systems, hardware, mobile devices, applications or mobile networks. Hence, it helps avoid future compatibility issues faced by the user.
e) Portability Testing
Tests the ease with which the software can be efficiently moved from one operating system or hardware to another. Aspects that are usually missed during unit and integration testing are taken care of in this testing method.
f) Baseline Testing
Also known as Benchmark Testing, this technique creates a benchmark for further testing. Baseline testing helps in defining baseline values against which the results can be tested. It involves verification of specifications and documentation, based on which test cases can be created.
g) Compliance Testing
This testing is performed to verify if requirements specified by the organisation are met. Also, it checks the design compliance, ensuring accurate implementation of specifications.
h) Documentation Testing
Documentation testing is all about checking if the instructions’ documentation on the working of a system matches with the way it actually works.
The documentation carries proof of improvements and changes made in the system. The process of reviewing all such documents, including test case specification, test report, and test procedure, is known as documentation testing. It’s a technique that is used to make things transparent for the client’s understanding.
i) Recovery Testing
In recovery testing, the software is subjected to forced failure to observe how quickly it can recover from a system crash. It eliminates detection of glitches once the software is handed over to the end-user and also enables the system to recover efficiently from failures.
j) Efficiency Testing
It involves testing the requirements of a program, in terms of coding and resources, to perform a specific function. Test efficiency is about the number of tests run in unit time. It makes sure that all the activities related to testing, such as test case creation, execution, and defect tracking, are performed efficiently.
k) Maintainability Testing
Tests the ease with which the system can be maintained to meet the requirements, e.g. future maintenance, adaptability to the changing environment and avoiding expected failures and faults.
Maintainability testing makes the system efficient enough to go through modifications, and results in reduced costs of future maintenance.
l) Internationalisation Testing & Localization Testing
Internationalisation refers to the process of making software adaptable for any region or language. This test is important for detecting problems that can halt the internationalisation of a product.
On the other hand, localisation means making an internationalised software adaptable as per requirements of a specific region’s culture and language. Localisation enhances user experience by making regional language support available for the user.
m) Performance Testing
Performance testing checks the stability, speed, and responsiveness of the system under a particular workload. Quantitative tests are performed to check the time taken by the system to respond. As the name suggests, performance testing is all about achieving optimal performance of the software for smooth user experience.
Performance testing can be further categorized into the following types:
I. Stress Testing
Stress testing involves pushing the system beyond its limits in terms of workload to identify bottlenecks and failure aspects. It is also called Fatigue Testing.
II. Scalability Testing
Done to check if the system can handle the increase in data volume, user traffic etc. It makes sure that the system is capable of scaling up without crashing.
III. Volume Testing
According to Glenford Myers, volume testing is, “Subjecting the program to heavy volumes of data. The purpose of volume testing is to show that the program cannot handle the volume of data specified in its objectives.”
Hence, it detects errors that might be caused due to an increase in database volumes.
IV. Endurance Testing
Also known as Soak Testing or Capacity Testing, endurance testing checks the extent to which a system can endure the expected workload for longer periods of times. It focuses on detecting defects like long-term memory leaks.
V. Load Testing
Load testing observes the performance of software under normal and extreme conditions. It checks whether the system crashes under increased load or sustains it. This test helps in defining maximum workload that a system can handle without adverse effects on its performance.
3. Structural Testing
Known as White-box Testing or Glass-box Testing, structural testing focuses on the working of the system and the code. Therefore, it is the developers who usually perform this test where they check the internal structures of the program functions for compatibility with the defined requirements and specifications.
Techniques used in Structural Testing:
a) Statement Coverage
Statement coverage executes all the executable statements at least one time in the source code. It also calculates the number of statements in the source code that have been executed and helps in identifying results of the source code. This technique basically engages with the internal workings of the code.
b) Branch Coverage
It checks the execution of each possible branch from decision branch, for at least one time. Thus, execution of all reachable code is ensured. Issues generated by statement coverage are usually eliminated in branch coverage.
c) Path Coverage
Path coverage is a comprehensive technique for designing test cases in such a way that it checks and ensures the traversing of all paths of the program at least once. It works more effectively and powerfully than branch coverage.
4. Change-related Testing
Change-related testing is performed to check the impact of each change made in the code, on the entire system. It detects, and helps in removal of, any malfunction in the software due to the changes.
Types of Change-related Testing:
a) Confirmation Testing
Also called re-testing, it makes sure that the tests that were previously failed are passed when executed after the bugs are fixed.
Confirmation testing can be executed with the same data in the same environment, so no new environment set-up is required. It requires less time because the focus is on specific features and issues only.
b) Regression Testing
This testing guarantees smooth functionality of the system after fixation of bugs and errors. Unlike confirmation testing, it is not performed on specific bug fixes.
Regression testing can also be performed in lesser time using automation tools which makes it cost effective too. Also, it ensures that the previously detected defects are ‘future proofed’.
The aim of software testing is to ensure that the software meets the highest quality standards for users’ requirements and expectations. Each testing type aims to enhance the software quality by making it secure and user-friendly.
A well-structured and clearly-defined test plan is significant for efficient testing. Furthermore, implementing the right testing techniques at the early stages of software development helps in fixing the flaws in a cost-effective manner. It is imperative to choose the techniques that are in line with the objectives which the software is meant to achieve.
Testing is an inevitable part of the software development lifecycle and should be considered as such. A software testing expert, James Sivak, explains this best:
“Testing has to be an integral part of developing software and not a separate phase. When this approach is taken, product quality is owned by everyone on the team. It is easy to state, but hard to put into practice because of long-standing preconceived notions that developers and testers are better kept apart.”
In short, do not leave testing for the later phases. Have both the developing and testing of your software implemented in tandem to help deliver remarkable, high quality, easy to manage software.