Мой самый большой вопрос - как правильно использовать TDD? У меня может быть неправильное представление, но из того, что я понимаю, вы сначала пишете все свои тесты и заставляете их терпеть неудачу, потому что у вас еще нет кода, но как я могу написать все свои тесты, если я еще даже не знаю всеединиц, которые у меня будут / нужны?
Не совсем правильная идея.
Вы могли бы начать с обдумывания проблемы и создания контрольного списка тестов, которыевы ожидаете, чтобы реализовать, прежде чем вы сделали.
Но фактический цикл реализации составляет инкремент . Мы работаем по одному тесту за раз, начиная с первого. Мы выполняем этот тест и очищаем весь код перед тем, как вводить второй тест.
Идея в том, что мы будем учиться по ходу дела - мы можем подумать о еще нескольких тестах,которые добавляются в контрольный список, или мы можем решить, что тесты, которые мы считаем важными, в конце концов не являются важными, поэтому они исключаются из контрольного списка.
В любой данный момент времени мы ожидаем, что либо (а) все реализованные тесты проходят успешно, или (б) точно один из реализованных тестов не проходит, и именно над этим мы сейчас работаем. Каждый раз, когда мы обнаруживаем, что выполняется какое-то другое условие, мы выполняем резервное копирование, возвращаясь к ранее хорошо понятному состоянию, и затем снова продолжаем двигаться вперед.
Обычно мы не нажимаем / не публикуем / не делимся кодом, когда он не работает,Вместо этого тест и рабочая реализация совместно используются. Мы не разделяем нарушенные промежуточные этапы или известные ошибки;вместо этого мы делимся успехами.
Обзор слайдов в игре по боулингу Kata может помочь прояснить, как выглядит ритм работы.
Это полностьюНормально чувствовать, что первый тест сложен - вы пишете тестовую реализацию для кода, который еще не существует. Мы склонны использовать воображение здесь;предположим, что нужный вам производственный код уже существует, как бы вы его вызвали? какие данные вы бы передали ему? Какие данные вы бы вернули? и вы пишете тест, как будто идеальный интерфейс для того, что вы хотите сделать, уже существует. Затем вы создаете производственный код, соответствующий этому интерфейсу;затем вы даете этому производственному коду правильное поведение;затем вы даете рабочему коду дизайн, который позволит легко изменить его позже.
И когда вы довольны всем этим, вы вводите второй тест, который обычно выглядит как первый тест с немного отличающимисяданные и другой ожидаемый результат. Итак, второй тест не пройден, и вы переходите к простому для изменения коду, который вы написали ранее, и адаптируете его так, чтобы второй тест также проходил. А затем вы снова очищаете конструкцию, чтобы код можно было легко изменить.
И так до тех пор, пока не дойдете до конца контрольного списка.