http://tfsbranchingguideiii.codeplex.com/
Also, I don't know what you call the "test projects", but if they change when your main code changes, then they should be branched with your main code.
Here's a brief description of how I set up a small application recently. I have not yet moved larger larger applications, so haven't yet dealt with things like libraries of common code.
$/TeamProject
/Development (folder)
/Development (branch)
/Lib
/Src
etc.
/Main (branch)
/Lib [third party binaries and other artifacts]
/Src
/Solution1
Solution1.sln
WebApplication
WebApplication.csproj
etc.
WcfServices
WcfServices.csproj
etc.
DAL
DAL.csproj
UnitTests
UnitTests.csproj
/Solution2 (same pattern as Solution1)
/Release (folder)
/Release (branch)
/Lib
/Src
etc.
- I have a CI build set up for the Development branch, building the "Dev" configuration. We deploy it to our Integration environment.
- I have the nightly build set up for our Main branch, building the "Test" configuration. When QA wants to test a new build, they deploy the latest of these to the QA environment.
- I have a manual build set up for the Release branch, building the "Prod" configuration. When we're ready to migrate to production, QA first tests the deployment process in their environment (will be a staging environment once we get one), and then Operations deploys this to the Production environment.