The writing a module and it's tests together, and doing them both at the same time is some of my #1 advice. If you're having to run main while developing, I consider something to be a bit odd.
I also find this a much more favorable approach than pure TDD. In my opinion, This method is easier to "sell" to other developers.
My opinion is that TDD can only reasonably be done if you already know what your implementation must be, which is difficult to do unless
* you have already done it, or something sufficiently similar, before;
* you have formal functional requirements; or
* you have detailed use cases.
Personally, I've recently come to really favor use cases as part of the design process. The mindset behind them requires some effort to learn, but I find them an effective vehicle for categorically separating what an application must do from any consideration for how it might do it.
I also find this a much more favorable approach than pure TDD. In my opinion, This method is easier to "sell" to other developers.