Verifying Software Quality: The Critical Role of Testing in the SDLC
Posted: November 7th, 2024
Authors: Nichole S. Brian H.
In the complex world of software development and digital solution implementation projects, testing plays a pivotal role in verifying that a product is not only functional but also reliable and user-friendly. For example, if you want to implement a digital solution that helps your company meet environmental compliance obligations, you should not just buy a product, put it on your network, and expect employees to start using it. The Software Development Life Cycle (SDLC) is the framework that outlines the stages of creating or configuring software, from initial planning to delivery and maintenance. Within this framework, various types of testing are conducted as part of the quality process to validate the software against requirements. A thorough testing program results in a final product that is robust, reliable, and meets user expectations.
It is essential to understand that testing is not a one-time event but an ongoing, iterative process that spans the entire lifecycle of the software. Multiple test cycles are necessary, so software continues to meet requirements and performs well under various conditions. These test cycles must involve the appropriate stakeholders, including developers, testers, business analysts, and end-users so that all perspectives are considered.
This article discusses three essential types of testing: Unit Testing, Functional Testing, and User Acceptance Testing (UAT). We will explore each of these and its significance in the SDLC.
Unit Testing
Unit testing is a fundamental aspect of the SDLC where individual components or modules of a software application are tested in isolation to verify they function correctly. This type of testing is typically performed by developers during the coding phase, before the integration of the components into the larger system. Unit testing plays a crucial role in the SDLC through identifying and fixing bugs early in the development process, which significantly improves code quality and reliability. In the case of configuring an Incident Management module, let’s assume the following items need to be incorporated as part of a client’s OSHA reporting requirements:
Task 1: An incident form needs to be created so that any employee can fill it out and either save it as a draft or submit it to the Safety Manager.
Task 2: An email should be sent out to the Safety Manager notifying them that an incident has been submitted.
Task 3: The Safety Manager can access the incident record, review the information provided, and mark if it was OSHA recordable.
Task 4: The Safety Manager can generate and print out OSHA Reports 300, 300A, and 301.
While it may seem logical that all items can be done in succession, this may not be feasible if these tasks were assigned to several different team members with several different timelines working in multiple time zones. In these cases, each team member configures their part of the solution and then tests to check what they have done works. In each round of testing, it’s also important that a peer also reviews and confirms the unit test is successful. By catching issues at the unit testing level, developers can prevent defects from propagating to later stages of development, thereby reducing the overall cost and effort required for testing and maintenance. Early detection and resolution of issues make unit testing an indispensable practice in delivering quality software.
Functional Testing
Functional testing is used to verify that the software performs the functions that it is supposed to do, according to the specifications and requirements. Functional testing covers the features, functionalities, and user interface of the software. It can be done at various levels, such as integration testing, system testing, and regression testing. Once all the individual parts of the development have been completed and tested in the unit testing phase, it is time to take a wider look at the solution and begin testing things as a whole during functional testing. As one might expect, putting together the work of multiple people does not always lead to a seamless and cohesive solution. There can be unintended interactions between different pieces of configuration that need to be addressed. Functional testing helps identify these gaps so that all the pieces built in isolation can come together in harmony. This testing may be referred to as end-to-end testing. In the earlier example, we unit tested four separate tasks as part of the client’s OSHA reporting requirements. Now that all four parts have been configured and combined, it is time for functional testing. During this round of testing, it was discovered the Safety Manager no longer received email notifications when an incident was submitted. With access to each team’s code, the owners of Task 2 can investigate why their configuration was no longer working, address the issue, and retest. Because full processes are being tested, functional testing helps confirm that the software meets the expectations and needs of the users and stakeholders. Identifying testers familiar with the end- to-end process is recommended for functional testing.
User Acceptance Testing
User Acceptance Testing (UAT) is a critical phase in the SDLC where the software is tested by the end-users to confirm it meets their requirements and expectations. This type of testing is performed by the clients or end-users after the system testing phase and before the software or subset of the software functionality is deployed to production. UAT plays a crucial role in the SDLC by validating that the software functions as intended in real-world scenarios and meets the business needs. It helps identify any issues or discrepancies that may have been missed during earlier testing phases, so the final solution is user friendly and fit for purpose. By involving actual users in the testing process, UAT provides valuable feedback and increases the likelihood of software acceptance, adoption, and satisfaction. This makes UAT an indispensable practice in delivering high-quality software that aligns with user expectations and business goals. In our working example, employees realized that they could un-submit and re-submit their incident records at will. Although not anticipated, the client determined this to be problematic for their business process and it was flagged as an opportunity for improvement. During UAT, opportunities for improvements or enhancements identified are typically captured as backlog. Those that are feasible and determined to provide value may be configured, tested, and deployed during subsequent cycles.
Summary
This article highlights the critical role of testing within the SDLC. We explored the importance of Unit Testing, Functional Testing, and UAT in checking that the software is robust, reliable, and meets user expectations. By understanding that testing is an ongoing, iterative process involving multiple stakeholders, we can appreciate its significance in delivering high-quality software that users will want to implement. Each type of testing plays a unique role in validating the software against requirements and verifying it performs well under various conditions. By implementing these testing practices, we can significantly improve the quality and reliability of the final product, ultimately leading to greater user satisfaction and successful project outcomes.
Stay tuned for follow-up articles in this series that will discuss best practices for developing and executing test cases and avoiding common testing pitfalls.
If you have any questions on what digital solutions might be the best fit for your company or facility, or need assistance with your next software implementation project, please contact Nichole Svezeny at nsvezeny@all4inc.com or Brian Hua at bhua@all4inc.com.