Software Testing is vital for any software development life cycle, it is fundamental to ensure the software quality and to have a workable functional software at the end of the project.
“Testing is any activity aimed at evaluating an attribute or capability of a program or system and determining that it meets its required results” Bill Hetzel, 1988
The main motive for the testing is to ensure that all functionalities are working correctly as per the requirements. It is not only that this is the basic purpose of testing, while It is important to test how to break the system, how to simulate the abuse of the system by the quality team before someone else does that for you and it will be a disaster at this time.
Software Testing requires several tasks to ensure the software quality. These tasks are not done now by regular reviews or functions executions to report the bugs. In most of the modern technological applications, the software quality team write the testing code before the development itself which is called Test-driven development (TDD) which known as a development technique where you must first write a test that fails before you write new functional code. TDD is being quickly adopted by software developers for the development of applications and there are a lot of frameworks now are supporting TDD.
I would like to reuse the quote of Peter Drucker “If you can’t measure, you can’t manage it”, similarly
“If you can’t test it, you should’t deliver it”
Why Software Testing?
Software Testing is not important only for the software company, it is also important for the customer. Many of the customers nowadays are concerned about how the software companies are ensuring their software quality, what is the process to do that and so on.
So, why Software Testing is important:
- The testing is verifying that the required functionality is working correctly and validating that every function meets the requirements and we delivered it to the customer as per the specifications. (Doing it right and deliver the right Things)
- It is important to make sure that the system does not do anything that it is not supposed to do.
- Effective testing will dramatically decrease the cost of the software, please read this article to see the cost of unreported defects in the software mapped to the SDLC.
- Continuous learning for the team, the team will learn from defects, when the team discovers a defect in function or requirements even, they learn how to avoid that in the future. This will increase the team maturity as well.
- It can decrease the system failures, there is known disasters have been reported due to insufficient testing.
- Quality products and software will ensure sustainable company reputation or it can turn it into an untrustworthy company.
Software Testing is a process aligned with the Software Development Life Cycle (SDLC) which is called the Software Testing Life Cycle (STLC). Any software should have its testing cycle mapped to the main development life cycle activities, for example, if we are using waterfall model, the testing cycle will be different from using an iterative model but it will have the main common activities in the process iteratively.
Regardless of the used SDLC model, every testing cycle has some common activities, which are:
- Requirements testing: mainly how to ensure that each requirement is testable.
- Test planning: It is about how to plan the testing activities, estimate the effort, the required team, ..etc.
- Writing Test Cases: In this activity, the testers start to write the testing scenarios and scripts, this scenarios should include unit, integration, system testing, ..etc.
- Test execution: It is mainly about preparing the testing environment and starting testing execution
- Testing feedback: after the execution, the testing results and defects report should be reported to the development team to start fixing them.
- Defect Retesting: when the developer report that the defect has been fixed, it should be tested again by the testing team.
- User Acceptance Test: this should be the validation activity with the end users who will use the system to ensure that they are working correctly from the business perspective. This can be iterative as well after the customer reports some defects as well.
- Testing Closure: It is important to know when we should stop testing, explore the testing findings, and learn from the cycle for the new testing cycles.
There a lot of articles are discussing the STLC, and they illustrated its different steps as well.
Despite the importance of the software testing, there are many software companies still not have effective testing strategies and some basic defects are detected by the customer which from my perspective it is not the job of the customer to report basic defects and bugs, for example, this button is not working, the phone number accepts text!, …etc. the customers should be concerned with business defects, not the technical ones.
Moreover, a lot of companies still believe that traditional functionality testing is enough for the system stability and operation and they neglected a lot of testing types which is not the case anymore. Therefore, I would like mainly to list the most important testing types should be done.
What are the testing types?
Before going through types, there are broader testing approaches which are:
- Blackbox (Functional): It is generally used when the tester has limited knowledge of the system under test or when access to source code is not available, it is mainly done through defined interfaces
- Whitebox (Structural): Known as clear box testing, glass box testing, transparent box testing, and structural testing. It is a method of testing software that tests internal structures or workings of an application, as opposed to its functionality, it is mainly done on the source code itself.
- Graybox: It mainly combines the two other approaches where the tester knows about the code and develop the test cases in the Blackbox approach.
These testing approaches can go deep to different levels from unit testing to acceptance testing as per the figure below
The following types of testing can be executed from Blackbox and Whitebox approaches and levels:
Performance testing is one of mostly neglected testing in companies due to its time and cost as well. Moreover, in many requirements document the quality performance requirements are not well defined to ensure system scalability. It examines responsiveness, stability, scalability, reliability, speed and resource usage of the software and its infrastructure
Performance testing can be done by applying:
- Load testing: checks how systems function under a heavy number of concurrent virtual users performing transactions over a certain period of time.
- Stress testing: Stress limits of the system (maximum # of users, peak demands, concurrency)
- Timing testing: Evaluate the time to perform a function and the response times to return the results.
- Environmental testing: It is about the tolerances for heat, humidity, motion, portability
- Recovery testing: It tests the operation of the system in case of data loss or hardware crash.
At most of the software projects, there are changes in requirements and new features are added as well. It is important to perform the new features’ test cases, but It is more important to ensure that it does not affect another tested features and functions.
Regression testing is performed to determine if the software still meets all of its requirements in light of changes and modifications to the software. Regression testing involves selectively repeating existing validation tests, not developing new tests. The most common approach to regression testing is to simply repeat the system tests. Therefore, the best to do that by using automated testing tools and techniques
Most of developed systems and applications have a certain level of interaction with the users, It became an important topic and research study how to develop the user experience and usable product and deliver the same experience to the user across different channels, for example, mobile apps, and web portals.
Usability testing is a technique used in user-centered interaction design to evaluate a product by testing it on users. This is in context, the usability inspection methods where experts use different methods to evaluate a user interface without involving users and ensure that its usable in terms of design colors, fields and information places, A/B test, how it takes to understand the system and use it. I think usability is a very interesting topic and it has been used any many fields as well not only for software projects.
Security became a very hot topic recently especially after cloud adoption, The goal of security testing is to identify the threats to the system and measure its potential vulnerabilities. It also helps in detecting all possible security risks in the system and help to fix these problems earlier before going to production. I wrote a lot of articles on security testing, you can go to this link to read them.
In the current digital age and the competitive software industry, it became essential to deliver not only the intended functionalities of the system but to ensure its scalability, agility, and modifiability. In order to reach this competitiveness in the market and to have qualified products, you need an efficient quality process of the software. The usage of traditional exploratory testing of finding bug or defects will not be the efficient way. Most of the companies are seeking continuous integration, deployment, and delivery, without automated testing it will not be applicable.