This paper describes a new approach to testing object-oriented programs, a set of tools based on this approach, and two case studies. Test cases consist of pairs of sequences of methods, along with a tag indicating whether those sequences should put objects of the class under test into the same abstract state. Experimental prototypes of tools for test generation and test execution are described. The test generation tool requires the availability of an algebraic specification of the abstract data type being tested, but the test execution tool can be used when no formal specification is available. Case studies involving execution of a large number of test cases, with various sequence lengths, parameters, and combinations of operations were performed.