Я не уверен, что это репрезентативно, но, как один разработчик, я использую 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