Abstract
Testing is the process of inferring the correctness of a program based on information collected during program execution. This process is called error-based when the information collected is used to infer that certain errors are not in a program. It is assumed here that a program can only be incorrect in a limited fashion specified by associating alternate expressions with program expressions. Substitution of an alternate expression for a program expression yields an alternate program that is potentially correct. The goal of error-based testing is to differentiate the program from each of its alternates. Two types of error-based testing are given. In static error-based testing the code is analyzed to produce two conditions. A creation condition describes when a class of alternate expressions will affect the program state. A propagation condition describes when an alternate program state will affect the output. If the output of the program is correct and both conditions are satisfied, all alternatives are faults detected by the test set. In dynamic error-based testing information is first collected from test executions. It is then proved that certain alternate programs are eliminated. A particular form of dynamic error-based testing based on symbolic execution is presented. In symbolic testing program expressions are replaced by symbolic alternatives that represent classes of alternate expressions.