April 8, 2022

Software testing: A helpful guide

In this article I will introduce testing in general, discuss its importance in software and I will present some testing types. Testing is essential because we all make mistakes. While some of those mistakes are not so important, others can be expensive for your business or even life-threatening (as in the example of Ariane 5 in 1996). This should make clear that web projects should never happen without testing. We have to test everything that we produce because things can just go wrong. In the best case scenario nothing severe happens — but you could always end up with a software simply being useless or even putting your users in danger.

Image showing a hot air balloon repaired with patches of different colors in order to not lose any air, illustrated in the factorial colors

First of all, what is software testing?

Software testing is an activity in order to reduce risk and improve quality by finding defects, errors, gaps. It is a method to check whether the actual software product matches expected requirements. This means finding missing requirements in comparison to the actual requirements. Testing is one component in the overall quality assurance (QA) process that seeks to ensure that systems enter service without defects that can prevent any web project from being successfully launched.

Why is testing so important?

Testing contributes significantly to the success of any projects. Here are a couple of arguments that highlight the relevance of it:

Bug-fixing: Testing helps to discover defects and bugs before the delivery to the client.

Security: People are looking for trusted products. With testing the security aspect can be verified.

Quality: Testing increases the overall quality of the system.

Reliability: Testing makes the software more reliable and easy to use.

Cost efficiency: By discovering defects and fixing them at an earlier stage testing can reduce unexpected costs appearing at the end of the project or even after the system is in live operation.

Types of testing

Testing is done by software testers: manually or by automation, this also depends on project requirements and other demands the project might have. There are many different types of testing that are divided into functional and non-functional. Functional testing describes what the product does, whereas non-functional testing describes how the product works. The first one verifies each functionality/feature of the software and non-functional testing verifies non-functional aspects like performance, usability, reliability. Sometimes, it can be hard to perform non-functional testing manually. Here are some examples of these types.

Functional

Unit Testing — Unit testing is the process of checking small pieces of code to ensure that the individual parts of a program work properly on their own. Unit testing validates the function of a unit. In other words, if the code does what it is designed to do. This type of testing is mostly done by developers.

Integration Testing — Integration testing is to verify that individual modules of code work together properly as a group. The purpose is to find defects in the interaction between software modules when they are integrated. We use integration testing to verify the interaction between several functions such as product selection, shopping cart, checkout, purchase information etc.

Smoke Testing - This type of testing is to ensure whether the deployed software build is stable or not. It is performed with a minimal set of tests run on the initial software build to verify that the critical functions of the program are working. 

Regression Testing — The goal of Regression Testing is to verify whether the changes in code have affected existing features or not, because sometimes new code changes have side effects on the existing functionalities. This testing is to ensure that the old code still works after new code changes are being executed.

Sanity Testing — Type of regression testing. It verifies the new functionality like bug fixes and also ensures that no further issues are introduced to these changes. 

User Acceptance Testing (UAT) — Usually this testing is performed by the end users or the client to accept or verify the software system before moving it to the production. User acceptance testing determines whether the software is acceptable for delivery or not. For example, Alpha and Beta testings are two types of user acceptance testing. Alpha testing is done by an internal team at the developer’s site before the software is released, whereas beta testing is done at the external site by roles outside the development organization (can be clients or groups of customers).

Non-functional

Performance Testing — This is a software testing process used for testing the speed, response time, stability, reliability, scalability and resource usage. With performance testing it is tested how the system behaves and performs under particular workload. There are a number of tools to run performance testing, such as Apache JMeter, WebLOAD, LoadNinja, Loadero etc. All these tools can be used to run Load and Stress testings as well.

Load Testing - Load testing can be considered a subtype of performance testing that checks how systems function under a heavy number of virtual users performing actions simultaneously over a certain period of time. It is to determine how many users the system can actually handle. Load testing identifies how a system behaves under an expected load. An example for this type of testing can be running numerous applications on a server or on a computer.

Stress Testing — Another subtype of performance testing that checks the upper limits of your system by testing it under extreme loads. This examines the upper limits of the system’s capacity using a load beyond the expected maximum and how it recovers when going back to normal usage. An example of stress testing can be an ecommerce application during a big sales day and a huge number of visitors trying to use the app.

Volume Testing — This non-functional test analyzes the system’s performance by increasing the volume of data in the database. Volume testing verifies if the system responds as expected for a certain volume of data. It may include increasing the size of the file. For example, a financial company generates xx GB of data and in the next two years it is predicted that the generated data volume will exceed xx * 10GB of data, and in five years it will generate xx * 50 GB of data. Here, volume testing is required to check if the system can support these predictions.

Usability Testing — Usability is a testing method for measuring how easy and user-friendly a software application is. A small set of target end-users use the software application to expose usability defects. Usability testing measures how “intuitive” users interact with the application, flexibility of application to handle controls and ability of application to meet its objectives.

Testing can take place in different stages of the software development life cycle depending on what model is selected for the project. For example, during the Waterfall model, testing starts after the development phase is done: this model suits more for projects that have clear requirements and are not changing these frequently. While in the Agile model every iteration has its own testing phase and the regression testing is done every time when new functions are released. Also, testing should be done in the specific environment (can be QA or Development) before the deployment to the next instance and after the deployment Smoke or Maintenance testing is needed on the deployed instance.

When to stop testing?

One of the most important testing principles is: Exhaustive testing is impossible. It could be possible to test small pieces of software exhaustively and then incorporate them where all possible data combinations are used. Here are two essential aspects to keep in mind. 

The most essential aspect is prioritization that helps to achieve an acceptable result from a finite and limited amount of testing. Do the most crucial tests first. This means to test the most important aspects of the system. These will test the functions with the highest relevance (as defined) and the most important non-functional behavior which will address the most significant risks. 

The next aspect to consider is completion criteria. The purpose of completion criteria is to prevent a task from being considered completed when there are still outstanding parts of the task which have not been finished yet. It is setting criteria that will give you an objective test of whether it is safe to stop testing or not.

Conclusion

To sum up, software testing is an essential phase in every web project because of all the different reasons that we have introduced above. There are still many types of testing that are not mentioned in this article. And generally these types are selected according to the project specifications. And don’t forget: Each member of the team and the teamwork increases the quality of the project. This means that every testing you will include in the project process, will help deliver a better final product.

image showing our colleague

Knarik Hovhannisyan

Software Testing Engineer

knarik@factorial.io