Types of software testing – an incomplete guide!
It’s hard to complete a definitive list of all the types of software testing there possibly are – but here we list a good proportion of the most common types you may come across.
There may be alternative names, methods or definitions, but the basic concepts behind them are the same – here we list them alphabetically.
Types of software testing
Acceptance testing tests the software for acceptability by the client or business to ensure and evaluate the software’s compliance with the business requirements and assess whether it is acceptable for delivery to the client or similar. It is the last phase of the testing, after which the software goes into production. This is also known as User Acceptance Testing (UAT).
Accessibility testing determines whether the software is useable/accessible for disabled people. This can refer to a user who is: blind, deaf, visually impaired, has learning disabilities or similar, or is simply of old age.
Alpha testing attempts to identify all the possible bugs or defects in software before release to the user or out on to the market. The focus of alpha testing is to simulate real-life users by carrying out the tasks that a typical user might perform.
Backend testing (or sometimes database testing) is defined as the type of software testing that checks the server side or database for errors. Whenever input or data is entered on a front-end application, it is stored in the database where testers can easily verify data by running queries, validating the application’s database and APIs. Back-end testing aims to ensure that the data contained in the database and its structure satisfy the project’s requirements.
Backward compatibility testing
Backward compatibility testing validates whether the newly developed software or updated software is compatible with its older version. If any part of the software is updated then it should function well on top of the previous version of that software.
Beta Testing is generally carried out by the customer/end-user. It is the final stage of testing undertaken before an application or software is released for commercial purposes. It is usually undertaken via a limited-scale release to the real user environment before a full release to all users in a company or organisation. Beta testing is carried out to ensure that there are no major bugs in the software or product and that it satisfies the business requirements from an end-user perspective.
Black box testing
Black-box testing is a method of software testing that examines the requirements and functionality of an application only. The internal system design is not considered and it is solely the ‘outputs’ that are tested. This method of test can generally be applied to every level of software testing.
Boundary value testing
Boundary value testing checks if defects exist at boundary values. There is an upper and lower boundary for each range, so if testing requires a test range of numbers from 1 to 500 then boundary value testing is performed on values at 0, 1, 2, 499, 500 and 501.
Comparison testing is when an application’s (or other) strengths and weaknesses are compared with its previous versions, or compared with similar products in the marketplace.
Compatibility testing validates how software behaves and runs in a different environment: e.g. on different web servers, hardware, and networks in different configurations.
Component testing is undertaken to identify if any defects or bugs exist after connecting multiple functionalities together. Normally conducted after the completion of unit testing – component testing is performed on each individual component separately without integrating with other components.
End-to-end testing involves testing of a complete application environment in a situation that simulates real-world use. This type of testing looks at how the app interacts with databases, using network communications and interacting with other hardware, applications, or systems where appropriate.
Exploratory testing is often purposely ad hoc, with test cases created on the fly, in a simultaneous process of test design and execution. Exploratory testing is generally informal and performed by the testing team to explore the application, looking for defects. Because of its nature, testers are advised to keep track of their activity during test.
Functional testing is similar to black-box testing in that it ignores the internal processes and focuses solely on the output of a system to see if it meets the requirements.
Gorilla testing is whereby one module or the functionality within the module is tested thoroughly and heavily. The objective of this testing is to check the robustness of the application and to attempt to ‘smash’ it! Testers and developers will often join forces and deluge the app.
Graphical user interface (GUI) testing
The aim of GUI testing is to validate the GUI as per the business requirement. This is usually done through a variety of test cases. GUI testing involves checking any screens with controls, input fields, menus, buttons, icons, and all bars (toolbar, menu bar, dialog boxes, and windows, etc.) The GUI testing includes the size of the buttons and input field present on the screen, alignment of all text, tables and content in the tables. It also validates that pages do not fluctuate and alignment is retained after hovering/selecting items etc.
Happy Path testing
The aim of Happy Path testing is to focus only on the valid and positive inputs through which an application generates the expected output. Applications are tested on a positive flow only, with no searching for negative conditions or errors. It is a well-defined test case using known input, which executes without exception and produces an expected output. Also known as Happy Day, Sunny Day or Golden Path testing.
Incremental Integration testing
Incremental integration testing is whereby a module is tested before being integrated with other modules. This approach is often used in agile projects as instead of integrating everything at once and testing, the integration is done incrementally, with each module tested individually in the unit testing phase, and then modules are integrated and tested one-by-one to ensure a smooth interface and interaction between modules.
Install / Uninstall testing
Install / Uninstall testing is undertaken to verify if the software installs with all the necessary components and the application is working as expected. This is very important as installation would be the first user interaction with the end usersInstallation and uninstallation testing is done on full, partial, or upgrade install/uninstall processes on different operating systems under different hardware or software environment.
Testing of all integrated modules to verify the combined functionality after integration is termed as Integration Testing. Modules are typically code modules, individual applications, client and server applications on a network, etc. This type of testing is especially relevant to client/server and distributed systems.
Load testing is a type of non-functional testing whereby a system is pushed hard to see how much load or maximum work/traffic it can handle without any performance degradation. This is done to find the maximum capacity of the system and to highlight any issues that might occur. It’s a form of performance testing that aims to assess how an application or system functions under real-world conditions.
Monkey testing is when a tester enters random inputs and values into a system as a monkey might – without any knowledge or understanding of the application. The aim of this type of testing is to see if it systems/apps crash when provided with random input values/data.
Mutation testing is a type of white box testing (see below) in which the source code of one of the programs is slightly changed in order to verify whether the existing test cases can identify the new defects introduced to the system.
Negative testing is whereby testers use incorrect data, invalid data or inputs, and actively attempt to break the system. It’s aim is to see that if the system throws an error from invalid input or unexpected user behaviour, it will behave as expected.
Non-functional testing involves testing of non-functional requirements such as the way a system operates, rather than specific behaviours of that system: load testing, stress testing, security, volume, recovery etc. The objective of non-functional testing is to ensure whether the response time of the application or software is quick enough as per the business requirements.
Performance Testing (or ‘stress’ and ‘load’ testing) is undertaken to check whether the system meets the performance requirements and determines how a system performs in terms of responsiveness and stability under a specific workload. The system is usually overloaded using various specialist tools for this job.
Pen testing (penetration testing, ethical hacking), is the testing of a computer system, network or application to find security vulnerabilities that an attacker could exploit. It can be undertaken using automated or manual practices.
Recovery testing determines how well an application or system recovers from crashes, hardware failures and other similar problems. If you pull the data cable out, then plug it back in again – does the system pick up where it left off ok?
Regression testing tests the whole application for performance after the modification of any module or functionality. Regression testing involves re-running functional and non-functional tests to ensure that previously passed software still performs after a change.
Risk-Based testing involves the testing of functionalities or requirements based on their priority. Highly critical functionality, which has the highest impact on business and in which the probability of failure is high, is tested first. Usually, risk-based testing is carried out if there is insufficient time available to test entire software platforms/applications.
Sanity Testing determines if a new application or software build is robust enough to undergo a major testing effort or not. If it’s crashing in initial use cases, then a build or application is created at this stage to fix it.
Security testing is usually undertaken by special teams who attempt to penetrate an application/system in order to disrupt it and/or copy information. It is performed in order to check how the software/app/website is secure from internal and external threats. This can include Red team / Blue team exercises whereby one group of testers (red team) attempts to breach security systems and the opposing group (blue team), attempts to defend it.
Smoke testing is where the testing team ensures the build of a system/app provided by the development team, is stable. Smoke testing checks that no serious defects exist in the build that might prevent the testing team testing the application in greater detail.
Static Testing (or dry run testing) is executed without any code. The execution is performed on the documentation during the testing phase and the actual program or application is not used – programmers manually read their own code to find any errors. Static testing is a stage of White Box testing (see below).
Stress testing is performed in order to check how and when a system fails if stressed beyond its specifications. This is achieved by placing it under heavy load, such as inputting large numbers beyond storage capacity, undertaking complex database queries, supplying continuous input to the system or database.
System testing is Black Box type testing that is based on overall requirement specifications and covers every aspect of the system – with the complete and integrated software tested.
Testing of an individual software component/module or ‘unit’ is termed as Unit Testing. This is normally undertaken by the programmer and not by software testers per se, as it requires a detailed knowledge of the internal program design and code. Unit testing it may require the development of test driver modules or test harnesses. The purpose is to validate that each unit of the software performs as designed.
Usability testing tests the app/system with real users. Users are observed by a researcher to check application flow as they complete tasks. Any problems or confusion they experience while using the software etc., is documented.
Volume testing (or flood testing) is a type of non-functional testing performed by placing the software or application under the pressure of receiving a huge volume of data to check the system behaviour and response time.
Vulnerability testing involves identifying weakness in the software/hardware/network. The vulnerability assessment process identifies threats and the risk they pose. Vulnerability testing normally uses automated testing tools, such as network security scanners, to check if malicious programs/hackers can take control of the system or whether or not it is vulnerable to viruses/worms etc.
White Box testing
White Box testing (or Glass Box testing) is based on testing the internal logic of an application’s code – internal structures or workings – as opposed to its functionality. In white-box testing an internal perspective of the system is used to design test cases. Internal software and code working should be known for performing this type of testing.
Please let us know in the comments below if you’d like to contribute to this article!