Подтвердить что ты не робот

Каков хороший рабочий процесс git для TDD?

Мне очень нравится

Вот что я сейчас делаю, на ветке функции:

Напишите тест, зафиксируйте Тест может привести к ошибкам из-за несуществующих интерфейсов, исправить это, исправить фиксацию Сделайте (сейчас только неудачный) тест, измените фиксацию Рефакторинг, новый фиксация goto 1
4b9b3361

Ответ 1

Я не уверен, что это репрезентативно, но просто говоря как один разработчик, я использую git -flow и здесь (примерно) мой рабочий процесс для новой функции:

  • Создание ветки функции
  • Записать неудачный приемочный тест высокого уровня (огурец), который завершился неудачей с тегом @wip (работа в процессе), поэтому на данный момент он отсутствует в тестовом наборе и передает его новой ветке
  • (Иногда) пишите тест запроса rspec для тестирования интеграции реберных случаев и передайте его ветке свойств
  • Напишите тесты нижнего уровня (rspec/jasmine) для отдельных компонентов функции и для каждого грубо определенного "блока", передайте ветвь функции
  • Когда функция завершена настолько, что она проходит тест приемочного тестирования, снимите тег @wip, убедитесь, что он прошел и передал ветвь функции
  • Объедините ветвь функции в ветку разработки, используя git merge (а не git flow finish). Это оставляет ветвь функции там, поэтому я могу обновить функцию позже, если это необходимо.
  • Как только филиал будет объединен для разработки, travis-ci запускает полный набор тестов на нем, и если есть какие-либо проблемы, я получаю электронное письмо. (Я включаю только ветки разработки и мастера в файл .travis.yml.)

Я должен сказать, что это мой "идеальный" рабочий процесс. На практике я сильно нарушаю эти правила: совершите непроверенное изменение перед написанием теста, начните работу над частями функции до того, как на самом деле выровнят высокоуровневые приемочный тест и т.д. Я в основном единственный, кто участвует в проекте, поэтому у меня есть свобода сделать это; если вы работаете в более крупной группе, я думаю, вам придется быть более строгим в том, чтобы придерживаться любого рабочего процесса, который у вас есть.

Во всяком случае, как я это делаю. Я был бы увлечен услышанными от других людей, поэтому я поддержал этот вопрос.

UPDATE:

Я понял после написания этого, что есть один смысл, в котором я отклоняюсь от вышеупомянутого потока, который есть, когда я добавляю "функции", которые не являются строго говоря обычным пользовательским видом (т.е. не то, что пользователь было бы известно). Например, на раннем этапе разработки приложения мы решили использовать backbone.js для структурирования нашего js-кода, поэтому я создал для него ветку функций и добавил теги @javascript к различным существующим функциям огурца. Я объединил его, как только ветка была в состоянии сделать (с backbone.js) то, что оригинальное приложение делало с представлениями HTML.

Я также планирую перейти на использование require.js, и в этом случае я также создаю ветку функций для этого, и как только это будет сделано, слейте ее обратно. Там не будет никакого теста интеграции на высоком уровне - пока проходят существующие тесты, все это хорошо.

Ответ 2

Легкий способ подумать о том, когда вы должны зафиксировать:

  • Могу ли я описать, что я совершаю с сообщением фиксации, которое имеет смысл?
  • Есть ли какие-то причины, по которым я, возможно, захочу вернуться к этому моменту или отменить этот вопрос?

Это означает, что это действительно зависит от человека. Если вы никогда не обнаружите, что делаете разницу на одном из этапов, возможно, потому, что вы исправляете это достаточно быстро, чтобы вы все еще помнили, что вы изменили, тогда вам действительно не нужно совершать. Однако в этом нет вреда, кроме времени, необходимого для ввода команды.

Другая альтернатива, если вы действительно не чувствуете, что шаг требует долгосрочного фиксации, состоит в том, чтобы просто сделать git add. Таким образом, git diff покажет вам, что изменилось с момента добавления, а git diff --cached покажет вам, что изменилось ранее. Это то, что я делаю, потому что я предпочитаю, чтобы мои коммиты были компилируемыми и передавали модульные тесты. Таким образом, легко вернуться в известное хорошее состояние.

Ответ 3

Я думаю, что хорошим и простым руководством было бы совершать каждый раз, когда вы "зеленые" или, по крайней мере, каждый испытательный цикл:

  • Либо красный → зеленый → рефакторинг → фиксация
  • или красный → зеленый → Commit → Refactor → Commit

Ответ 4

Я не верю, что есть рабочий процесс фиксации, специфичный для TDD, единственное правило, которое я пытаюсь соблюдать, связано с тем, что я стараюсь не нажимать коммиты со сломанными тестами на главную ветку (если она уже сломаны). В моих ветвях функций обычно проверяются только те тесты, которые связаны с функциями, но все тесты будут проверены при выполнении слияния обратно на мастер. Если я знаю, что коммит действительно оставляет некоторые из тестов функций сломанными или по какой-либо другой причине, которые делают это так, только тогда я укажу его как wip. Что касается более практической стороны, я думаю, что больше пользы в том, чтобы проявлять особую осторожность, чтобы не нажимать на нелегальные ветки.

Ответ 5

Мой рабочий процесс очень похож, но подумайте о том, чтобы лучше использовать область постановки.

  • Напишите тест, git добавить.
  • Тест может привести к ошибкам из-за несуществующих интерфейсов, исправить это, git добавить.
  • Пройдите тест (теперь только с ошибкой), git commit.
  • Рефакторинг, git зафиксировать изменения.
  • Перейти к 1.

Это обеспечивает соблюдение дисциплины, которая при каждой фиксации проходит все тесты. На этапах 1-3 я могу вернуться к последнему git добавить в любое время с помощью git checkout.