Let's suppose you are a software developer. You've won the contract, written the code and everything seems great.
But, have you actually ensured the product of your labor does the job it is supposed to do? You should probably test it!
Avoid this step at your peril.
What is software testing?
Software testing, as the term suggests, is an activity that is performed to check whether the results of software match expectations. Software testing, effectively, makes sure that the software does exactly what is it supposed to do -- a.k.a. it verifies that software is fit for purpose.
Software testing objectively assesses a software component, or an entire software system, to evaluate one or more of its properties as bugs, and other issues, can be very expensive (and even dangerous). It is an important process to help identify bugs, errors, gaps, or any other missing requirements from the initial brief or client specifications, if any.
Software testing can either be performed manually or by using automated tools, or indeed, a blend of the two.
Why is software testing necessary?
Software testing is a great way, as we have previously mentioned, to identify flaws in the product before launching it.
To hammer the point home, here are some real-life examples of why proper software testing should be taken seriously.
- In April of 2015, Bloomberg's London terminal crashed due to a software glitch. This affected hundreds of thousands of financial market traders. IT even forced the UK government to postpone a 3 billion pound debt sale. With proper testing, this could have been avoided.
- Also in 2015, due to an unidentified software glitch, Starbucks was forced to close around 60% of its stores in the U.S. and Canada. Due to a problem during the daily system refresh of their point of sale system preventing the company from making transactions. In some cases, Starbucks was forced to serve orders for free.
- In February 1991, during the First Gulf War, an Iraqi missile hit the US base of Dhahran in Saudi Arabia, killing 28 American soldiers. Following an investigation, it was determined that the base’s antiballistic system failed to launch because of a computer bug. The internal clock had drifted by a few milliseconds an hour, which eventually had a huge impact on the systems' timing.
- Nissan was once forced to recall just under 1 million of its 2013 and 2014 Infiniti models from the market after a serious software bug was identified, associated with its airbag sensors. This followed two accidents that led to the issue finally being discovered.
- During the Falklands War of 1982, the Royal Navy destroyer, H.M.S. Sheffield has sunk due to a software glitch linked to its radar warning system. According to a report from the time, while it was able to pick up the incoming Exocet anti-ship missile, it recorded it as "friendly", preventing the launch of countermeasures.
- Recently, the Boeing 737 Max 8 was grounded for software upgrades after two aircrafts crashed in 2018. These software glitches not only cost Boeing billions but also sadly cost the lives of hundreds of people.
If a proper testing regime had been conducted, it is quite possible at least some of the above could have been avoided. But, these mistakes are not easy to foresee before they happen. As the saying goes, hindsight is 20:20.
What are the benefits of software testing?
As we have already seen, not testing software to its breaking limits can have dire consequences. Also, there are also some very important, and tangible, benefits to developers from software testing.
These include, but are not limited to:
- Software testing is very cost-effective: This is probably the most important benefit of software testing. Testing any IT project in a timely manner helps you to save money in the long term. This is especially true for spotting errors, bugs, and other issues early on in the development cycle.
- Software testing helps improve security: Another vitally important benefit of testing is ensuring the product's security, it pays dividends to the developer. It not only ensures consumers to trust the product, but it also helps plug holes in its defenses before hackers find them.
- Product quality: This is an essential requirement of any software product. Testing ensures that a quality product is delivered to customers.
- Customer Satisfaction: The main aim of any product is to give satisfaction to their customers. UI/UX Testing ensures the best user experience.
What different types of software testing are there?
Software testing is generally divided into three major categories. These are, broadly: -
- Functional testing
- Non-functional testing/performance testing
- Maintenance testing
Functional testing, as defined by Techopedia is, "a software testing process used within software development in which software is tested to ensure that it conforms with all requirements. [It] is a way of checking software to ensure that it has all the required functionality that's specified within its functional requirements."
In a nutshell, functional testing is used to ensure the software is providing the same output required by the end-user and consumers.
Non-functional testing, on the other hand, is a form of software testing to assess non-functional aspects of a piece of software. This will usually be things like performance, usability, reliability, etc.
This form of testing is designed to test the readiness of a system, as per nonfunctional parameters which are not normally addressed by functional testing. A good example would be to check how many users can log in at any one time.
Maintenance testing, unlike the previous two, is usually performed to identify potential equipment problems when, say, migrating software from one piece of hardware to another.
It can also be used to check whether any other hardware changes, repairs, or upgrades, deleteriously affected a piece of software or not. Such software testing can be performed at either the system, equipment, or component level, depending on needs.
From here on in we will explore some of the most common software testing types that fall under these broad categories (with the exception of maintenance testing).
Trust us when we say this list is far from exhaustive. In fact, there are well over 150 different types of them, and growing.
You should also note that the following list is in no particular order, with the exception that we have split them up under functional, non-functional, and maintenance-type software testing.
What types of Functional software testing are there?
Here are some of the most common forms of functional software testing.
1. Integration Testing
Integration testing is a form of software testing that is designed to check all the integrated modules within a piece of software. This usually occurs after all component modules have been integrated together, hence the term.
Modules can typically consist of 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.
2. Unit Testing
Unit testing, unlike Integration testing, is a form of software testing that assesses an individual component or module. A unit is the smallest testable part of any software. Such testing is usually performed by the programmers themselves and not by dedicated testers. This is because it tends to require detailed knowledge of the program's internal design and code.
Unit testing is the first level of software testing and is done before Integration testing.
3. System Testing
System testing is somewhat similar to Integration testing but is more comprehensive. This form of testing will check the entire system for its overall compliance with the software's requirements.
Sometimes called Black-box type testing, it is performed after integration testing, and verifies that the entire software package works as expected. It is an essential testing process to ensure the highest quality possible for any delivered package.
4. Smoke Testing
Smoke testing is a type of preliminary testing that is used to check the basic functionality and stability of a particular application. Such a test is intended to be quick to execute, and its goals are generally to give assurance that major features of a system work as anticipated.
Such testing is usually performed right after a new build has been developed, and checks for stability prior to more in-depth testing. Smoke tests effectively look for "show stopper" defects within the code that could prevent later tests from running properly, or at all.
As Software Testing Help points out: "If testers find that the major critical functionality is broken down at the initial stage itself, then the testing team can reject the build and inform accordingly to the development team. Smoke Testing is carried out to a detailed level of any Functional or Regression Testing."
5. Sanity Testing
Sanity testing is used to determine whether, or not, a new software version performs well enough to accept it for further major testing. If, for example, an application crashes on the initial use, then the system is deemed too unstable for further testing.
It is also used to check minor changes in code, or functionality, to ascertain that no further issues are introduced due to these changes. This test is not used to objectively verify the software but ensure that the developer has applied rationality (i.e. sanity) when producing it.
6. Regression Testing
Regression testing is used to test an application as a whole when a modification to a module or function has been performed -- hence the name regressive. It is used, in effect, to confirm that any changes made have not adversely affected other existing features.
Guru99 defines regression testing as: "re-execution of already executed tests to ensure existing functionalities work fine." This testing checks if the code changes affect the existing functionalities. "It ensures that the old code still works once the latest code changes are done."
7. Graphic User Interface (GUI) Testing
Graphic User Interface, GUI for short, testing is, as the name suggests, a test of the interface against client or end-user requirements. This is usually explained in the project brief and will also typically have reference GUI mockups to test against.
Such tests will usually check things like the size of buttons and input fields at a given or range of resolutions. It will also check the alignment of text, tables, and general content.
Such testing should also validate any menus present such as the populated dropdowns. IT also validates that pages do not fluctuate, and alignment remains stable when hovering over them with a mouse pointer.
8. Beta Testing
Beta testing is a form of software testing you have probably heard of even if you are not in the profession. Unlike others already mentioned, this type of testing is often performed by customers and other third-party end-users.
It is, in effect, a test of the software in a real-world environment before the product's ultimate release. Such testing is carried out to ensure that there are no major failures of the software and that it satisfies all requirements.
End-users will generally be encouraged to provide feedback to the developers and also offer suggestions for potential improvements. Once compiled, developers will then action any improvements prior to the final release.
9. End-to-end testing
This form of software testing is used to test whether the flow of an application from start to finish behaves as expected. Its purpose is to identify system dependencies and to ensure that data integrity is maintained between various system components and systems.
It will usually test the entire application for critical functionalities like communicating with other systems, interfaces, databases, networks, and other apps.
10. Usability Testing (User Experience - UX)
This software test checks, as the name suggests, its actual user-friendliness. Also known as UX, application flow is tested to see whether a new, inexperienced user can understand the application, or not.
It can also test any help functions to see if they are useful and checks that system navigation is logical.
Non-functional software testing
Here are some of the most common forms of non-functional software testing.
1. Performance Testing
Performance testing, sometimes including stress or load testing, is an important form of non-functional software testing.
This one checks whether a system meets defined performance parameters, it uses a variety of tools.
2. Stress Testing
As previously mentioned, stress testing can either be performed as part of a general performance test or as a standalone test. As the name suggests, this tests the software to the limits of its defined performance and beyond.
It effectively attempts to discover how and when the system will fail, once beyond normal performance expectations. Such a test is usually carried out under heavy loads, like inputting data beyond storage capacity, making complex database queries or continuous inputs to the system, or testing database loads.
3. Load Testing
Another form of non-functional software testing, load testing checks to see how the system behaves when multiple users accessing the program at the same time. It is most relevant for multi-user systems; often those built using a client/server model, such as web servers.
Load testing can be performed using tools like JMeter, LoadRunner, WebLoad, Silk performer, etc.
4. Security Testing
Security testing, as the name suggests, checks any piece of software for its ease, or difficulty, to be hacked. It is often performed by specialist testers, like white hat hackers, and is used to find a software's strengths and weaknesses from both internal and external threats.
"This testing includes how much software is secure against malicious programs, viruses, and how secure and strong the authorization and authentication processes are.
It also checks how software behaves against a hacker attack or a malicious program and how software is maintained for data security after such a hacker attack." - Software Testing Help.
5. Volume Testing
Volume testing is another non-functional software test that is typically performed by a performance testing team. The software under inspection is exposed to huge amounts of data and the test checks how the software behaves and responds.
It is used to assess what impact, if any, such an influx of data has on performance and processing time.
6. Compatibility Testing
This form of software testing validates how a software package behaves in various different environments. This will include things like web servers, hardware, and network environment.
This form of testing checks that it can run on different configurations, databases, etc. and their various versions, if applicable.
7. Install/Uninstall Testing
As the name suggests, this form of testing performs checks on full, partial, or upgrade installs and uninstalls. It is normally tested across various operating systems using a variety of different hardware and software environments.
8. Reliability Testing
This form of software testing assesses the probability of a software's failure-free operation for a specified period of time across multiple environments.
"Reliability testing is performed to ensure that the software is reliable, it satisfies the purpose for which it is made, for a specified amount of time in a given environment, and is capable of rendering a fault-free operation." - Software Testing Help.
9. Recovery Testing
Recovery testing is another critical test to see how a particular piece of software behaves following system crashes or other disasters. It checks to see how well the system in question is capable of being restored after such instances.
Such tests are relatively simple in practice and can involve simply unplugging network cables to force a loss of connection. The point of the test is to see if the software is able to revert to a point prior to the failure and continue to operate.
10. Compliance Testing
Compliance testing, also known as conformance testing, regulation testing, or standards testing, is another common software test. This test will determine the compliance of the system to set external standards.
The content of such tests may vary depending on the requirements of the standard being applied.
11. Localization Testing
And finally, Localization testing is a form of software testing used to assess its behavior with respect to different cultures or settings. Its main purpose is to check appropriate linguistic and cultural aspects for a particular geographical location.
In other words, it is a process of customizing software applications for the targeted language and country.
And that is all folks.
We hope, by now, you have gained an appreciation for the types of software testing and its importance. The above is but the tip of the iceberg when it comes to software testing. However, all forms of software testing are important components to ensure the software works as expected, safely, and reliably.
Without a comprehensive package of tests, end product software can have some pretty serious issues that are not only dangerous for users but will also, potentially, backfire on the developer.
"A stitch in time, saves nine", as the famous saying goes. Wise developers should never cut corners when it comes to testing their software prior to release -- it could actually kill people.