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

Мне очень нравится модель ветвления Gitflow

но я не уверен, куда поместить цикл TDD - должен Я просто использую функциональную ветку и фиксирую каждый раз, когда я написал или прошел тест (плюс после рефакторинга)? Создать дочернюю ветвь и объединить «готовые» блоки в ветку функции? Должен ли я фиксировать каждый неудачный тест или только после его успешного прохождения?

Вот чем я сейчас занимаюсь в функциональной ветке:

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

person Tobias Kienzler    schedule 16.08.2012    source источник
comment
@shioyama Итак, вы совершаете новые, но неуспешные тесты или только после их прохождения? Пожалуйста, не стесняйтесь публиковать это как ответ, если вы подтвердите мое предположение, что это уже ответ   -  person Tobias Kienzler    schedule 16.08.2012
comment
Чтобы ответить на ваш вопрос: я стараюсь не фиксировать ничего, что нарушает работу набора тестов, но мои функциональные ветки не включены в мой файл travis-ci, поэтому, если они не сработают, я не получу электронное письмо или что-то еще. Это произойдет только в том случае, если я объединю их (без исправления) в ветку разработки или master.   -  person Chris Salzberg    schedule 16.08.2012


Ответы (5)


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

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

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

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

ОБНОВЛЕНИЕ:

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

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

person Chris Salzberg    schedule 16.08.2012
comment
+1, я тоже группа из одного человека: -7 Также спасибо за упоминание огурца, на который я посмотрю (или поищу эквивалент Python) - person Tobias Kienzler; 16.08.2012
comment
Огурец в некотором роде полезен, но в последнее время я действительно начал думать, что, возможно, лучше все делать в rspec. Прочтите эту статью: jimmycuadra.com/posts/please-don-t -использовать-огурец - person Chris Salzberg; 17.08.2012

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

  • Либо Красный -> Зеленый -> Рефакторинг -> Фиксация
  • или Красный -> Зеленый -> Фиксация -> Рефакторинг -> Фиксация
person Assaf Stone    schedule 17.08.2012
comment
Я думаю, что фиксация перед рефакторингом (ваш второй вариант) немного лучше, поскольку в противном случае есть риск разрушить функциональный код. И если ошибка будет обнаружена позже, в истории есть две реализации, которые нужно проверить: -7 - person Tobias Kienzler; 17.08.2012
comment
Я согласен с тем, что 2-й вариант более безопасен (совершать коммит каждый раз, когда вы зеленый), но некоторые люди могут посчитать это слишком трудоемким. Если вы работаете короткими циклами, у вас действительно не так много возможностей разрушить функциональный код между итерациями RGR. В большинстве случаев вы всегда можете отменить изменения. - person Assaf Stone; 18.08.2012
comment
Хм, может быть, можно даже пойти дальше, позволив модульному тестеру автоматически создать фиксацию с именем зеленый или красный или изменить, если это вызвано последней фиксацией. Тогда еще можно будет переустановить позже ... - person Tobias Kienzler; 18.08.2012

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

  1. Напишите тест, git add.
  2. Тест может выдавать ошибки из-за несуществующих интерфейсов, исправьте это, git add.
  3. Сделайте тестовый проход (пока только неудачный), git commit.
  4. Рефакторинг, git commit изменить.
  5. Перейти 1.

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

person Robin Adams    schedule 09.06.2016

Самый простой способ подумать, когда вам следует совершить коммит:

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

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

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

person Karl Bielefeldt    schedule 16.08.2012

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

person prusswan    schedule 16.08.2012