From the structural or execution side, a software system consists of interplaying elements, modules or sub-systems.
In turn, from the target clients’ point of view, the general system comprises of linked functions or operations.
Finite-state machines may be used to create and test these connected system functions, executions and related usage.
There are two fundamental kinds of complex interactions beyond one-step links in finite-state machines:
- Specific interactions among data points in implementation, with some of the later ones depending on the definitions and values of earlier ones for their definitions and values.
- Interactions along an implementation path, where later implementations are influenced by all that went on before them.
The testing of these interactions is through what are generally named data flow testing and control flow testing correspondingly.
These methods are ordinarily white-box testing techniques due to the level of detail captured in their models, but they have also found some applications as black-box testing techniques applicable to testing system-level functional flow, data dependencies, and related interplays.
Actually, such methods and related studies represent some of the earliest formal studies of software testing.