The waterfall model is a linear and sequential software development method that features distinct goals for each phase of development. In a waterfall development methodology, when one phase is completed, development proceeds to the next phase and so on. Testing is the second to last step in this process, right before deployment. Alarmingly, the unit test process is often skipped in waterfall development because test happens so much later in the process. Developers often move on to integration testing because of time to market pressures. However, considering where defects may be discovered throughout development and where those defects will need to be fixed, when unit testing is skipped all of the advantages of finding defects and fixing them earlier on are lost. If errors are found late in the process, all that code has to be refactored -- time to market will be further delayed and costs will be much higher.
Some are only doing functional test, which is the second highest costly place to fix defects. That is one of the many reasons why testing early is important. During unit testing, developers assess each unit individually for its ability to function properly and meet operational requirements. Leading companies have discovered that conducting unit test to find and fix bugs early significantly lowers the overall cost of software development while improving software quality.
As a result, Test-Driven Development (a methodology where tests are designed up front -- before any code is written) is now being used by many industry leaders as it offers significant advantages over waterfall development. In a classic waterfall approach, developers create source code first before approaching unit, or any other type of testing. Test-Driven Development emphasizes that test cases be created during the high-level design - after the API has been developed, but before any of the code has been built. The benefit of this methodology is that test case creation is not affected by assumptions made in the code implementation. Therefore, the tester can concentrate on the requirements of the code, and on the interface provided. By putting up this framework at the beginning, there are essentially “guardrails” in place and it is easier to test the code as a result.
The process is designed to inject quality very early on in the software development life cycle so testing isn’t an afterthought; instead it is done up front so there is an assessment of quality from the beginning. It also has the advantage of saving time and money as it helps to prove a potential design before any capital is spent on the implementation of that design.
Continuous Integration is also a key component of Test-Driven Development. Each developer integrates changes to configuration management as they are ready for testing, leading to multiple integrations per day. Each integration is then verified by an automated build and test step to detect integration errors as quickly as possible. This approach leads to significantly reduced integration issues, allowing the project team to develop more cohesive software in a shorter amount of time.