The foundation of software testing
The first brick in the foundation is that it's almost impossible to prove a negative. This means that while it is possible to find bugs, it is impossible to prove that bugs don't exist. You can't prove the absence of defects. In this case, the absence of evidence is not necessarily evidence of absence.
Testing should begin as early as possible. The earlier that testing begins in the software development lifecycle, the easier it is to focus on specific objectives. Ideally, the software testing team should be included right from the start as part of the analysis and requirements phase. This will enable them to have a better understanding of the product under development. Also, the earlier that bugs are found the easier and less costly it will be to make corrections.
Experience shows that 80% of defects are usually in 20% of the code, which helps speed up bug finding. This means that a relatively small number of modules will contain most of the problems. This is especially useful in pre-release testing because when we find a defect in an area or module we can be pretty certain that we know where to look for more.
Another important element is that change can affect previously written code. Changes made to establish code can alter software operation in unforeseen ways, this is why regression testing is so important. This problem can be reduced if requirements are established as thoroughly as possible in the development cycle. It's important to remember that exhaustive testing simply isn't possible. There are too many limitations in terms of time and money for it to be any other way.
Testing is directly related to function. Different applications are tested differently and at differing intensities depending on what their functions are. The software running a chain of radar stations looking for incoming missiles would be tested more frequently and in different ways than the software which supports an e-commerce site. This may seem a pretty simple observation, but it becomes more subtle when dealing with small differences between the function of applications. It is the reason why requirements should be as detailed as possible in order to make certain that all the right tests are actually performed.
These are some of the important bricks that help make the foundation of software testing. But, perhaps the most important of all is that software must meet user requirements. The purpose of an application or system is the reason for its existence and, ultimately, all testing must enhance that purpose.