Don't forget specification-based testing à la tmoertel's Test::LectroTest (which he talked about in RFC: Tutorial on Testing). I've tinkered with it some; when it fits the kind of unit being tested, it's spectacular.
I agree that it's is useful stuff where it fits, but to be honest I don't find it fitting that often :-)
The trouble I have applying specification based testing is that, like design by contract, it's tricky to apply incrementally. Personally I find TDD and specification based tests a bad fit since I now code in small increments, and specification based tests are very much all-or-nothing.
Specification based tests are certainly a useful tool, but I don't find myself reaching for it very often.