I'm not sure about formulating all of the tests beforehand though, ...
Yuck. I would hate to write all the tests beforehand.

Fortunately, that's not what we do. We write one test. And then write just enough code to make that one test work. Then we write another test, and write just enough code to make that second test work. Continue until complete.

I know, it sounds weird. Its hard to visualize unless you see it in action. I've been doing the test-first thing now for several years now and it has really helped me to write solid code. I highly recommend the process.

There are some good walk-throughs using test-first design on the web. I'll see if I can find one and post the URL here.