Look at the design of your project. If it is anywhere close to the MVC layout or one of it's alternatives then you should have distinct levels of different assemblies. Make one test subassembly for each level of your design.
Our test project usually runs in place of the project that creates the EXE. Our EXE project is a thin shell that passes event and information to an assembly filled with controller classes that has the code most people put into a EXE Project. This allow the Test Project to pretend to be the EXE for 90% of the normal testing process.
We are still working out the best arrangement for the actual test cases. Right now we have several major levels of our framework Utility, Applicaiton Objects, UI Framework, Commands, UI Controllers, and EXE. We have one assembly for each level except for EXE (which is tested manually). When we edit an assembly we load the test assembly for that level. When we need to do something that touches every level we have to load all the test assemblies.
During our one button build process we run the test project exe. (We have a separate utility for this).