Introduction
When building a house, the best three tips you will receive are: location, location, location. When building a software application, the best three tips you will receive are: testing, testing, testing. In software development, there are so many different kinds of testing that even the developers can get confused. "What do you mean by white box testing?" is something I have heard in many an interview. There is Unit testing, Integration testing, Validation, Verification, Performance testing, Usability testing, and then Regression testing, which means we have to be able to do all these types of tests in a reproducible way over time and code changes. As you can see, testing is the most time-consuming part of software and ironically, in my experience, the least automated and most haphazardly organized. Validation and Integration are testing how the whole product works together and are not very useful in the beginning stages of development. Perhaps worse is that these types of tests are dependent on others in the team, which takes the control for meeting your deadlines out of your hands and into the hands of the developer that is the furthest behind. Verification testing should definitely not be done by developers because they cannot objectively verify that the requirements were met. Of course the developers believed they met the requirements or else they would have created the solution differently. Usability testing should be conducted by people not even familiar with the project. That leaves two kinds of testing that can be done by the developers themselves at any time during the development process: Unit testing and Performance testing.