If the users are involved in implementing parts of the project, some independent supervision of the users' tests may be in order. The charts from the design section showing flow of data which show the procedures, flow of data, software states and their transitions can all provide excellent starting points for defining a suite of tests for all functions. Frequently a project can be divided into a number of loosely connected functions. These components can be developed concurrently, tested separately, and finally combined for comprehensive tests. It is important to test the system as a whole to ensure that interactions between components are also tested.
Large projects require testing in phases as the components are completed.
Delaying tests until the whole system is complete produces an overwhelming test burden and hides the numerous flaws until too late. With the addition of each new layer or component of the system, it is necessary to repeat the previous test phases. This assures that adjustments between components still result in a working system. A carefully designed test environment is frequently neglected, being considered an unwanted by-product of the system rather than the incubator. A basic test environment is simply a copy of the system which can be run, tested, without damaging or otherwise affecting normal operations.