One of the most significant aspects of a software development project
is the integration strategy. Integration may be performed all at once,
top-down, bottom-up, critical piece first, or by first integrating
functional subsystems and then integrating the subsystems in separate
phases using any of the basic strategies. In general, the larger the
project, the more important the integration strategy.
Very small systems are often assembled and tested in one phase. For
most real systems, this is impractical for two major reasons. First,
the system would fail in so many places at once that the debugging and
retesting effort would be impractical [PRESSMAN].
Second, satisfying any white box testing criterion would be very
difficult, because of the vast amount of detail separating the input
data from the individual code modules. In fact, most integration
testing has been traditionally limited to ``black box'' techniques [HETZEL].
Large systems may require many integration phases, beginning with
assembling modules into low-level subsystems, then assembling
subsystems into larger subsystems, and finally assembling the highest
level subsystems into the complete system.
To be most effective, an integration testing technique should fit well
with the overall integration strategy. In a multi-phase integration,
testing at each phase helps detect errors early and keep the system
under control. Performing only cursory testing at early integration
phases and then applying a more rigorous criterion for the final stage
is really just a variant of the high-risk "big bang" approach. However,
performing rigorous testing of the entire software involved in each
integration phase involves a lot of wasteful duplication of effort
across phases. The key is to leverage the overall integration structure
to allow rigorous testing at each phase while minimizing duplication of
effort.
It is important to understand the relationship between module testing
and integration testing. In one view, modules are rigorously tested in
isolation using stubs and drivers before any integration is attempted.
Then, integration testing concentrates entirely on module interactions,
assuming that the details within each module are accurate. At the other
extreme, module and integration testing can be combined, verifying the
details of each module's implementation in an integration context. Many
projects compromise, combining module testing with the lowest level of
subsystem integration testing, and then performing pure integration
testing at higher levels. Each of these views of integration testing
may be appropriate for any given project, so an integration testing
method should be flexible enough to accommodate them all. The rest of
this section describes the integration-level structured testing
techniques, first for some special cases and then in full generality.