When you are testing a system, you should always adopt an incremental approach where you gradually integrate components from different teams and providers. Sometimes, you develop the overall structure of the system and then add components to it. This is called top-down integration. Alternatively, you may first integrate infrastructure components that provide common services, such as network and database access, then add the functional components. This is bottom-up integration. In practice, for many systems, the integration strategy is a mixture of these, with both infrastructure components and functional components added in increments. In both top-down and bottom-up integration, you usually have to develop additional code to simulate other components and allow the system to execute.
You use an incremental approach to integration to make it easier to discover interaction errors that occur. There are complex interactions between system components and, when an anomalous output is discovered, you may find it hard to identify where the error occurred. Initially, you should integrate a minimal system configuration and test this system. You then add components to this minimal configuration and test after each added increment.
In the example shown in Figure 1, A, B, C and D are components and T1 to T5 are related sets of tests of the features incorporated in the system. T1, T2 and T3 are first run on a system composed of component A and component B (the minimal system). If these reveal defects, they are corrected. Component C is integrated and T1, T2 and T3 are repeated to ensure that there have not been unexpected interactions with A and B. If problems arise in these tests, this probably means that they are due to interactions with the new component. The source of the problem is localised, thus simplifying defect location and repair. Test set T4 is also run on the system. Finally, component D is integrated and tested using existing and new tests (T5).
Figure 1: Incremental integration