Будь то юнит, компонент, интеграционные или приемочные испытания, важная часть - это то, что он должен быть автоматизирован Отсутствие автоматических тестов является фатальной ошибкой для любого программного обеспечения, от простых CRUD до самых сложных вычислений. Причина заключается в том, что написание автоматических тестов всегда будет стоить меньше, чем постоянная потребность в запуске всех тестов вручную, когда вы этого не делаете, на порядки. После того, как вы их написали, вам просто нужно нажать кнопку, чтобы посмотреть, пройдут они или нет. Ручные тесты всегда будут длиться долго и зависят от людей (живых существ, которым скучно, может не хватать внимания и т. Д.), Чтобы иметь возможность проверить, пройдены ли тесты успешно или нет. Короче говоря, всегда пишите автоматизированные тесты.
Теперь о причине, по которой ваш коллега может быть против проведения любого вида модульного тестирования без TDD: возможно, потому, что сложнее доверять тестам, написанным после производственного кода. И если вы не можете доверять своим автоматизированным тестам, они ничего не стоят . После цикла TDD вы должны сначала сделать тест неудачным (по правильной причине), чтобы иметь возможность написать производственный код, чтобы он прошел (и не более). Этот процесс по сути проверяет ваши тесты, поэтому вы можете им доверять. Не говоря уже о том, что написание тестов перед фактическим кодом подталкивает вас к разработке модулей и компонентов, чтобы их было легче тестировать (высокий уровень развязки, применение SRP и т. Д.). Хотя, конечно, выполнение TDD требует дисциплины .
Вместо этого, если вы сначала напишите весь производственный код, когда вы напишете тесты для него, вы ожидаете, что они пройдут при первом запуске. Это очень проблематично, потому что вы, возможно, создали тест, который покрывает 100% вашего производственного кода, не утверждая правильное поведение (может даже не выполнить никаких утверждений! Я видел, как это произошло ), так как вы не видите, что он не работает Сначала проверьте, если это не удается по правильной причине. Таким образом, у вас могут быть ложные срабатывания. Ложные срабатывания в конечном итоге подорвут доверие к вашему набору тестов, по сути, заставив людей снова прибегнуть к ручному тестированию, поэтому у вас будет стоимость обоих процессов (написание тестов + ручные тесты).
Это означает, что вы должны найти другой способ проверить свои тесты , как это делает TDD. Поэтому вы прибегаете к отладке, комментированию частей производственного кода и т. Д., Чтобы иметь возможность доверять тестам. Проблема в том, что процесс «тестирования ваших тестов» намного медленнее. Добавление этого времени к тому времени, которое вы потратите на запуск специальных тестов вручную (поскольку у вас нет автоматических тестов, пока вы кодируете рабочий код), по моему опыту, приводит к общему процессу, который намного медленнее, чем практика ТДД "По книге" (Кент Бек - ТДД по примеру). Кроме того, я готов сделать ставку и сказать, что «тестирование ваших тестов» после их написания требует гораздо больше дисциплины, чем TDD.
Так что, возможно, ваша команда может пересмотреть "деловые и некоммерческие причины", чтобы не заниматься TDD. По моему опыту, люди склонны думать, что TDD медленнее по сравнению с простым написанием модульных тестов после выполнения кода. Это предположение неверно, как вы прочитали выше.