IMO, если вы хотите сделать ваши тесты простыми для запуска, тестовый проект (ы) обязательно должен идти в том же решении, что и производственный код. Хотя помещение тестов в другое решение может работать, если все разработчики очень усердны, это добавляет дополнительный барьер между изменением производственного кода и выполнением тестов. Я предпочитаю снимать как можно больше барьеров.
Есть несколько разных способов сделать это.
- Один тестовый проект для одного решения (Product.UnitTests.csproj)
- Один тестовый проект для системы (Product.SystemName.UnitTests.csproj)
- Сопоставление производственных и тестовых проектов один к одному (Product.ProjectName.csproj и Product.ProjectName.Tests.csproj)
У каждого есть свои компромиссы, которые вы должны взвесить.
Один тестовый проект для одного решения
Имеет смысл, если все решение содержит сплоченные проекты. Если вы всегда собираетесь разрабатывать с использованием одного и того же решения, тогда хорошо иметь централизованный тестовый проект.
Это означает, что процесс сборки сокращается (когда у вас есть решения с множеством проектов, уменьшение количества сборок также сокращает время сборки) и нет необходимости поддерживать файлы .nunit или тому подобное.
Кроме того, все знают, куда идут тесты. Недостатком является то, что вам приходится разделять разные производственные проекты с использованием пространств имен, а тесты для одного проекта теперь связаны с другими. То есть это «самый простой» способ получить вступительный взнос, так как отслеживать меньше, и разработчики могут легко запустить тесты. Недостатком является то, что в некоторых случаях это не подходит для того, что вы разрабатываете.
Один тестовый проект для системы
В основном то же самое, что и выше, за исключением того, что оно более мелкозернистое. Вы группируете связанные проекты в области / системы и используете для каждого отдельную тестовую сборку. Это немного увеличивает сложность, но также означает, что системы легче извлекать / повторно использовать в других решениях.
Индивидуальное сопоставление производственных проектов и тестовых проектов
Больше всего затрачивается на создание новых сборок, немного увеличивает время сборки при большом количестве проектов и, как правило, увеличивает размер файла вашего решения. Требует усердия в плане постоянного поддержания файлов проекта .nunit в актуальном состоянии и не очень хорошо работает с модульным тестированием в IDE.
Положительным моментом является то, что ведение тестового проекта для каждого производственного проекта означает, что тесты зависят только от функциональности, которую они тестируют (поэтому проще повторно использовать проекты), и вы можете легче проверить охват кода с помощью запускать один проект за раз (тогда как, если вы запустите все свои тесты, вы получите более высокий охват из-за несвязанных тестов, иногда затрагивающих код, который им не интересен). Кроме того, это простой шаблон для подражания, поэтому люди поймут, где тесты должны пройти без проблем.
В итоге: я думаю, что все вышеперечисленное может хорошо работать в зависимости от того, что вы разрабатываете, но если вам нужно решение, которое «просто работает», то я был бы склонен пойти на сопоставление один к одному.