One thing that I have been taught about this week is to be strict on taking small steps when doing TDD. When learning TDD for the first time you are trained to take the smallest possible step to make the test you are working on pass, and then add to your tests incrementally to make them fail again. 

After a while, it is easy to become overly confident in a particular programming language and TDD, and as a result you can fall into the trap of taking larger steps when writing code. The issue is when the steps are too large, the tests can start to fail for reasons that you were not anticipating which then may require a deeper analysis of the code you were just writing, or instead may have to resort to using a debugger.

Being strict in taking small steps whilst you are coding should result in your tests only failing for reasons that you are absolutely aware of. You should be able to foresee every failure/error.