In the software space, every CTO knows why they should invest time and money into new product development. The benefits are obvious: new features mean new opportunities to provide value to customers, and increased value often means increased profit. In other words, it’s easy to connect the dots from product development to value and profit.
With that said, the actual development of the software is only one part of the equation for providing value. Few quality products are developed without implementing strategies to perform functional testing and making a concerted effort to automate testing wherever reasonable. While this may seem obvious to developers and other technical personnel, the benefits of such strategies may need to be effectively communicated up the chain in order to secure company investment in this area. Below, I will discuss the meaning of functional testing, the benefits of investing in functional testing and test automation, and the dangers faced when companies fail to invest appropriately in these areas.
To adequately sell decision makers on the value of functional testing, you must first have a complete understanding of what we mean when we say functional testing. Functional testing is a form of software testing in which the application is tested against its functional specifications. In other words, it refers to testing the actual functionality of the application independent of aspects such as performance, security, etc.
Functional testing comes in many shapes and sizes. Consider the following examples of this type of software testing:
Unit testing - This refers to the testing of an individual component of a particular application. These can be automated, ensuring that core functionality is not compromised as the codebase evolves.
Acceptance testing - Following the development of a particular feature, acceptance testing should be performed as a sign-off indicating that the newly developed feature satisfies the provided requirements. When working in an agile environment, this type of testing can be performed at the conclusion of a sprint where a feature is completed. A common practice is to include this as a task within each user story to ensure that it isn’t overlooked. Acceptance testing helps to eradicate any misunderstandings surrounding feature functionality by providing a checkpoint at which functionality is verified by those writing the requirements.
Integration testing - Integration testing refers to testing portions of an application where components are forced to work together to perform some set of functionality. This type of testing can be automated, ensuring that components within the codebase are working together without issue.
Proper investment in functional testing is a two-fold commitment. First, the organization should commit to leveraging functional testing practices, making verification of functionality a natural part of their development process. Second, the organization should commit to implementing a strategy for automating their testing. When these two things are done in conjunction with one another, the benefits are far-reaching.
Test automation allows for continuous testing, or end-to-end automated testing throughout the development lifecycle. While the implementation and maintenance of a continuous testing strategy means an investment of time and resources, it will undoubtedly lead to the production of higher quality applications.
One of the biggest benefits of test automation is that it allows us to execute many forms of functional testing repeatedly throughout the development lifecycle. Testing in the development phase, for instance, often involves the automation of unit tests to be performed at the convenience of the developer and integration tests to execute with each merge and build. This increases the likelihood that bugs will be discovered before reaching the later stages of the application lifecycle, and finding these bugs at these early stages means that they will be less expensive to fix.
Continuous testing assists developers in identifying defective code before it is fully integrated with the codebase, allowing them to make the necessary changes as they continue development. In doing so, these bugs are less disruptive to the development process as a whole, as they fail to impact the later stages of the development process. In contrast, when bugs are not discovered at these early stages, they could trigger a major refactor late in the game, and an unexpected refactor at the tail end of the development process can then pose a significant threat to the delivery schedule—and nobody enjoys missing their deadlines.
With major defects being discovered/rectified in the early stages of development, and automated tests being performed in a continuous manner to ensure that new defects aren’t introduced into the evolving codebase, everybody on the team will have greater confidence in the quality of the product being developed. This confidence will be bolstered by the fact that leveraging automated testing practices often allows you to significantly increase test coverage within your application. This can have a significant and positive impact on both application quality and team morale, to say the least. Developers feel responsible for how the code they write performs, and therefore, they feel responsible when their code fails. Having checks in place to validate functionality and prevent bugs from being introduced into production can help put developers’ minds at ease. Effectively, this lessens their concern that major defects will slip through the cracks, which could reflect poorly upon the development team when discovered down the line.
In addition, the end users will also have a high level of confidence in the product. With increased quality comes increased user satisfaction due to their positive experiences with the application. This will keep them coming back while ensuring that the organization doesn’t earn a reputation for releasing non-functional features that cannot be relied upon.
Let’s be honest, the fun part for any development team is the design and development of new, groundbreaking features that resonate with the customer. Put simply, the fun is in the innovation, and an increase in effective software testing will lead to an increase in the amount of time that development personnel have to innovate. Let me explain.
When an appropriate investment is made to automate functional testing, quality will become inherent within the application. This will serve to prevent a sort of “tail wagging the dog” situation where the development team has to research broken functionality and fix defects, which eats into the amount of time they have to design and develop new features.
In contrast, if the proper time and resources are not applied to implement effective functional testing, then it’s more likely that developers and other technical personnel will find themselves constantly mired in troubleshooting and resolving issues within the application—issues that could have been detected and resolved earlier in development. In essence, inaction could delay the development of new and exciting features that could help increase the value that the organization provides to the customer.
Automated functional testing is an essential part of any good application development process. With automated testing, functionality issues in code are discovered earlier in the development process where they are less expensive to resolve. This leads to a higher quality product that satisfies both users and management alike, while allowing the development team more time to innovate. The effective communication of these benefits up the chain is important in the effort to secure an investment of time and resources to appropriately implement an effective testing strategy.
Scott Fitzpatrick is a Fixate IO Contributor and has 7 years of experience in software development. He has worked with many languages and frameworks, including Java, ColdFusion, HTML/CSS, JavaScript and SQL.