Специально для C #:
Обратите внимание, что класс и его тесты тесно связаны.Разделение на две сборки растягивает это связующее звено через границы сборки.
Я предпочитаю размещать свои модульные тесты в той же сборке, что и класс, который они тестируют.Для каждого класса C
в пространстве имен N
я помещу модульные тесты в классе CTests
в пространстве имен N.Tests
.
Тривиально тестировать закрытые классы.(Обычный рефрен в TDD заключается в том, что вы не должны проходить модульное тестирование частных пользователей; я согласен. Здесь я говорю о internal
классах и internal
членах.)
Мне не нужножонглируйте как можно большим количеством сборок.
Я должен добавить, что я не против отправить мои юнит-тесты моим пользователям.Было бы иначе, если бы они загружали по коммутируемому каналу или работали в системах с минимальным объемом памяти.
В стороне:
Если бы я мог, я бы поставил свои модульные тесты ввложенный класс, например:
public class C
{
// note 'private' accessibility.
[TestFixture]
class Tests
{
// tests here
}
// Implementation of C here
}
Некоторые преимущества:
Переименование C
не требует переименования CTests
.
Я точно знаю, где найти мои тесты.
Тест и тестируемый код всегда вместе.
Это работает только если ваши классы маленькие.Как только они становятся большими, файл становится огромным.Можно использовать partial
классы, чтобы поместить их в отдельные файлы.
К сожалению, среда модульного тестирования в NUnit и Visual Studio не видит закрытые тестовые фиксации.Я не верю, что есть преимущество в том, чтобы исключать закрытые тесты, но именно так они и работают.