From Problems with TDD:
If your goal is to be confident in your code, then TDD is a weak method for developing those tests of confidence. I’ve now shown a couple of TDD examples, which were done with TDD principles foremost in mind, but which failed to consider worst-case solutions. You should not be confident that your code works just because your TDD tests pass.
When I write my code, I’m not confident that it works. I’m not even confident that a refactoring works despite passing all of the unit tests. I worry about edge cases I didn’t think of, I worry about implementation flaws, I worry about worst-case scenarios.
Amen. (Emphasis is mine.) I think TDD actually makes things worse: the fake feeling of comfort that you’ve passed the tests that YOU wrote is useless to me. I want to know what people are going to do that I DIDN’T think of.