I've often stumbled over answering the question, "how is testable code different?" to people new to testing. Textpattern has the best elevator-speech answer I've seen:
Scripted unit tests are becoming increasingly important in the Textpattern release process. You can make your code more testable by using a functional design with minimal coupling. A function that can be run in isolation, and returns a value based on its arguments, is easy to test. A function that prints output based on global variables, database records and configuration values is much harder to test.
That's right. It's not about use of objects, it's about keeping side effects to a minimum. Nicely put.