This kind of schedule compression can usually be avoided by starting test activities earlier in the project. We don't need to use any information about the implementation to select these tests and their test inputs. Effective testing is guided by information about likely sources of error. The combination of polymorphism, inheritance, and encapsulation are unique to object-oriented languages, presenting opportunities for error that do not exist in conventional languages. Our testing strategy should help us look for these new kinds of errors and offer criteria to help decide when we've done enough looking.
Conventional testing is useless for objects.
Objects are so different, everything we know about conventional testing is useless. Conventional testing doesn't deal with state and collaborations. There is a large body of knowledge about testing which is theoretically and practically proven. We know how to model paths, states, data flow, and how to efficiently select test cases. While the kinds of errors we're likely to see in object-oriented code are different than those in conventional software, basic testing techniques continue to apply, with the necessary changes.