Как я могу гарантировать, что все модульные тесты проходят до совершения?

У нас были проблемы в последнее время, когда разработчики берут код SVN, который не проходит модульные тесты, не компилируется на всех платформах или даже не компилируется на своей собственной платформе. Хотя это все подхвачено нашим CI-сервером (Cruise Control), и мы установили процессы, чтобы попытаться остановить его, мы действительно хотели бы, чтобы в первую очередь могли прекратить совершать мошеннические коммиты.

Основываясь на нескольких других вопросах, представленных здесь, кажется, что Bad Idea ™ заставляет это делать как крюк с предварительной фиксацией на стороне сервера, главным образом из-за продолжительности времени, необходимого для сборки + запуска тестов. Я сделал несколько Googling и нашел это (все разработчики используют TortoiseSVN):

http://cf-bill.blogspot.com/2010/03/pre-commit-force-unit-tests-without.html

Что бы решить по крайней мере две проблемы (она не будет построена на Unix), но она не отвергает фиксацию, если она терпит неудачу. Итак, мои вопросы:

  • Есть ли способ сделать крюк pre-commit в TortoiseSVN заставлять коммит сбой?
  • Есть ли лучший способ сделать то, что я пытаюсь сделать в целом?

Ответ 1

Нет абсолютно никакой причины, по которой ваш крюк с предварительной фиксацией не может запускать тесты Unit! Все, что нужно сделать, это сделать:

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

Это вполне возможно. И, послесловие, все в вашем магазине разработки будут ненавидеть ваши кишки.

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

Сколько времени требуется, чтобы выполнить сборку и пройти через модульные тесты? 10 минут? Представьте, что вы делаете фиксацию и сидите там в течение 10 минут, ожидая, когда ваша сделка состоится. Вот почему вам говорят не делать этого.

Ваш сервер непрерывной интеграции - отличное место для проведения модульного тестирования. Я предпочитаю Hudson или Jenkins через CruiseControl. Их проще настроить, и их веб-страница более удобна для пользователя. Еще лучше, что у них есть множество плагинов, которые могут помочь.

Разработчики не любят, чтобы их знали, что они сломали сборку. Представьте, если бы все в вашей группе получили электронное письмо с сообщением о том, что вы совершили плохой код. Не могли бы вы убедиться, что ваш код хорош, прежде чем вы его совершили?

У Хадсона/Дженкинса есть несколько хороших графиков, которые показывают вам результаты модульного тестирования, поэтому вы можете видеть на веб-странице, какие тесты прошли и провалились, поэтому очень четко видно, что произошло. (Веб-страница CruiseControl сложнее для обычного глаза, чтобы анализировать, поэтому эти вещи не так очевидны).

Один из моих любимых плагинов Hudson/Jenkins - это игра непрерывной интеграции. В этом плагине пользователям даются баллы за хорошие сборки, тесты модульных модулей и создание более пропущенных модульных тестов. Они теряют очки за плохие сборки и ломают единичные тесты. Там табло, на котором показаны все точки разработчика.

Я был удивлен, как серьезно задумались разработчики. Как только они поняли, что их оценки CI были публичными, они стали очень конкурентоспособными. Они будут жаловаться, когда сам сервер сборки потерпит неудачу по какой-то нечетной причине, и они потеряли 10 очков за плохую сборку. Тем не менее, количество неудачных модульных тестов упало, вниз, и число модульных тестов, которые были написаны, выросли.

Ответ 2

Существует два подхода:

  • Дисциплины
  • Инструменты

По моему опыту, № 1 может вас только доставить.

Таким образом, решение, вероятно, является инструментом. В вашем случае препятствием является Subversion. Замените его на DVCS, например Mercurial или Git. Это позволит каждому разработчику работать на своей собственной ветке без кошмаров слияния Subversion.

Время от времени разработчик будет отмечать функцию или ветвь как "полную". Настало время объединить ветвь функции в основную ветку. Вставьте это в "промежуточное" хранилище, которое наблюдает ваш сервер CI. Затем сервер CI может вытащить последний коммит (ы), выполнить компиляцию и протестировать их, и только если это пройдет, нажмите их в основной репозиторий.

Итак, цикл: main repo → developer → staging → main.

Здесь есть много ответов, которые дают вам подробности. Начать здесь: Mercurial workflow для ~ 15 разработчиков. Должны ли мы использовать названные ветки?

[EDIT] Итак, вы говорите, что у вас нет времени для решения основных проблем в вашем процессе разработки... Я позволю вам угадать, как это звучит для всех...; -)

В любом случае... Используйте hg convert, чтобы получить репозиторий Mercurial из дерева Subversion. Если у вас стандартная настройка, это не займет много времени (вам просто нужно много времени на вашем компьютере, но оно автоматически).

Клонировать, что репо, чтобы получить рабочее репо. Процесс работает следующим образом:

  • Разработайте свой второй клон. Создайте для этого ветки функций.
  • Если вам нужны изменения от кого-то, конвертируйте в первый клон. Вытащите из этого в свой второй клон (таким образом, у вас всегда есть "чистая" копия из подрывной деятельности, на случай, если вы испортитесь).
  • Теперь объедините ветвь Subversion (default) и ветвь вашей функции. Это должно работать намного лучше, чем с Subversion.
  • Когда слияние в порядке (все тесты выполняются для вас), создайте патч из разницы между двумя ветвями.
  • Примените патч к локальной проверке из Subversion. Он должен применяться без проблем. Если это не так, вы можете очистить локальный чек и повторить. Нет возможности потерять работу здесь.
  • Зафиксируйте изменения в subversion, преобразуйте их обратно в репо # 1 и потяните в repo # 2.

Это звучит как много работы, но в течение недели вы придумаете script или два, чтобы выполнить большую часть работы.

Когда вы заметите, что кто-то сломал сборку (тесты больше не выполняются для вас), отмените слияние (hg clean -C) и продолжите работу с веткой вашей рабочей функции.

Когда ваши коллеги жалуются, что кто-то сломал сборку, скажите им, что у вас нет проблем. Когда люди начинают замечать, что ваша производительность намного лучше, несмотря на все обручи, которые вы должны прыгать, упомяните "было бы намного проще, если бы мы поцарапали SVN".

Ответ 3

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