ABSTRACT

Faults and failures due to interaction are the bane of testers. Their subtleties make them difficult to recognize and even more difficult to reveal by testing. These are deep faults, ones that remain in a system even after extensive thread testing. Unfortunately, faults of interaction most frequently occur as failures in delivered systems that have been in use for some time. Typically, they have a very low probability of execution, and they occur only after a large number of threads have been executed. Most of this chapter is devoted to describing forms of interaction, not to testing them. As such, it is really more concerned with requirements specification than with testing. The connection is important: knowing how to specify interactions is the first step in detecting and testing for them. This chapter is also a somewhat philosophical and mildly mathematical discussion of faults and failures of interaction; we cannot hope to test something if we do not understand it. We begin with an important addition to our five basic constructs and use this to develop a taxonomy of types of interaction. Next we develop a simple extension to conventional Petri nets that reflects the basic constructs, and then we illustrate the whole discussion with the simple automated teller machine (SATM) and Saturn windshield wiper systems, and sometimes with examples from telephone systems. We conclude by applying the taxonomy to an important application type: client-server systems.