TDD и модульное тестирование не являются альтернативами друг другу. В каждом проекте вы должны тестировать свой код, здесь вы проводите модульное тестирование, интеграцию и тестирование системы.
TDD, однако, модель развития. Подобно Waterfall и другим методам разработки, TDD также является методом. В TDD у вас есть некоторые основные требования, и вы пишете модульные тесты, чтобы убедиться, что требования реализованы и работают. Но когда вы пишете модульные тесты, вы понимаете, что для достижения основных требований вам нужно реализовать больше функций и классов. Таким образом, модульные тесты в этом контексте проясняют другие требования.
Предположим, вам нужно написать приложение, которое печатает имя компьютера, на котором запущено приложение. Сначала вы пишете юнит-тест:
[Test]
public void ProducedMessage_IsCorrect()
{
AreEqual(BusinessLibrary.ProduceMessage(), System.Environment.MachineName);
}
и тогда вы понимаете, что вам нужно реализовать функцию ProduceMessage. Вы реализуете это настолько просто, насколько это возможно, чтобы модульное тестирование прошло. Вы пишете метод так:
public string ProduceMessage()
{
return "MyComputer";
}
Затем вы запускаете тест, и он проходит. После этого вы отправляете свой код, а другие члены команды получают код. Когда они запускают тест, тест не проходит, потому что вы жестко закодировали имя своего компьютера в коде.
Итак, какой-то мудрый член вашей команды меняет код на правильную форму, и вы продолжаете.
Все дело в выборе разработчиков, имеющих опыт работы с TDD. Я думаю, что по крайней мере некоторые из них должны быть опытными разработчиками TDD.