Как вы, вероятно, поняли, обычное соглашение .NET - иметь тестовый код в отдельной сборке (в общем, в Visual Studio каждый проект дает отдельную сборку).
Почему это так?
- Предоставляет варианты развертывания
Многие (в том числе и я) считают, что вам не следует развертывать тесты для производства.
- Пределы проверки доступа
Помогает убедиться, что тесты работают с открытым интерфейсом тестируемого кода, что повышает необходимость правильной разработки API (хотя иногда это является ограничением - см., Например, Вопрос 261177 )
- Помогает держать каждый тест маленьким
Раньше я проверял свои тесты в одном и том же проекте, но обнаружил соблазн повторно использовать слишком много кода, в результате чего модульные тесты выполняли слишком много и были слишком хрупкими.
Для чего бы то ни было, я держу свои тесты в отдельных проектах, хотя и в одном и том же решении, используя атрибут [InternalsVisibleTo] по мере необходимости. Я называю каждый тест как .Tests.dll, а затем использую подстановочный знак в сценарии NAnt, чтобы найти все тесты для запуска.