Testing Object-Oriented Systems: Models, Patterns, and Tools