Обеспечьте минимальное покрытие новых коммитов Subversion

У нас есть масштабный проект, в котором практически нет модульных тестов. Я хотел бы гарантировать, что отныне разработчики будут фиксировать новые функции (или ошибки!) без минимального охвата соответствующими модульными тестами.

Какие есть способы обеспечить это?

Мы используем множество инструментов, поэтому, возможно, я смогу использовать плагин (jira, greenhopper, fisheye, sonar, hudson). Я также подумал, что, возможно, крюк предварительной фиксации Subversion, плагин принятия фиксации для jira или что-то подобное.

Мысли?


person Nicolas Rodríguez Seara    schedule 02.03.2011    source источник
comment
Вы имеете в виду, что я хотел бы гарантировать... что разработчики не вносят новые функции без минимального охвата? Похоже, вы хотите правило 0-покрытия как есть.   -  person Matthew Gilliard    schedule 03.03.2011


Ответы (3)


Сонар (кстати, замечательный инструмент) с плагином Build breaker может сломаться вашей сборки Hudson, когда некоторые показатели не соответствуют указанным правилам. Вы можете настроить такое правило в Sonar, которое будет вызывать предупреждение (в конечном итоге приводя к сбою сборки), когда покрытие ниже заданной точки. Единственным недостатком является то, что вы, вероятно, хотите, чтобы охват рос, поэтому вы должны помнить о повышении уровня оповещения каждый день до текущего значения.

person Tomasz Nurkiewicz    schedule 02.03.2011
comment
Отличное предложение, спасибо. Однако я могу вспомнить о недостатке, связанном с тем, что в настоящее время приложение не имеет минимального охвата (и для его достижения потребуется серьезное время, это большая вещь). Я хочу сосредоточиться только на новых функциях/исправлениях ошибок/фиксациях, хотя, конечно, возможно, я неправильно понял вашу точку зрения. - person Nicolas Rodríguez Seara; 03.03.2011
comment
Итак, настройте минимальное покрытие на 0% или 0,5% или на то, что у вас есть сейчас. Если после первого дня охват составляет 0,7%, увеличьте уровень оповещения до 0,7%. Если какой-то разработчик коммитит код без тестов, очень вероятно, что глобальное покрытие упадет до 0,65%, что ниже сегодняшнего уровня и приведет к сбою сборки. По крайней мере, ваш охват не уменьшится. - person Tomasz Nurkiewicz; 03.03.2011
comment
Если бы он проверял покрытие только проверяемого фрагмента кода (файла), то вы могли бы установить уровень покрытия примерно 10-30% для начала. Это потребовало бы небольшого количества обратной засыпки при каждой регистрации, не заставляя их использовать всю кодовую базу, чтобы заставить регистрацию работать. - person Bill K; 03.03.2011
comment
Я бы добавил одно предостережение. Представьте себе сценарий, в котором кто-то заменяет 2kLOC кода с лучшим покрытием одним вызовом сторонней библиотеки. Несомненно, хороший ход, верно? Но общее тестовое покрытие вашего проекта уменьшилось. - person Matthew Gilliard; 03.03.2011
comment
Лучшей метрикой, чем %возрастного охвата, является просто number of lines not covered — чем ниже, тем лучше. - person quamrana; 03.03.2011

Что вы хотите сделать, так это определить, что такое новый код, и убедиться, что новый код покрыт некоторым тестом.

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

Наша (Semantic Designs) линейка инструментов тестового покрытия может определить из списка измененных файлов, только отдельные файлы, которые необходимо переинструментировать, а при тщательной организации тестирования — только те тесты, которые необходимо выполнить повторно. Это сведет к минимуму затраты на повторный запуск тестов, и вы все равно получите те же данные об общем покрытии. (На самом деле эти инструменты определяют, какие тесты необходимо провести, основываясь на изменениях на уровне метода).

Когда у вас есть данные о покрытии тестами, вы хотите знать, что конкретно новый код покрыт некоторыми тестами. Вы можете сделать это небрежно, просто используя данные тестового покрытия, если вы знаете, какие файлы были изменены, настаивая на том, чтобы измененные файлы имели 100% покрытие. На практике это, наверное, не работает.

Вместо этого вы можете воспользоваться инструментами Smart Differencer от SD, чтобы дать более точный ответ. Эти инструменты сравнивают два языковых файла и указывают, где изменения, используя синтаксис языка (например, выражение, оператор, объявление, тело метода, а не только измененные строки исходного кода) и концептуальные операции редактирования (перемещение, копирование, удаление, вставка, переименование). идентификатор внутри блока). Дельты SmartDifferencer, как правило, меньше и точнее, чем то, что вы получили бы от простого инструмента сравнения.

Из вывода SmartDifferencer легко извлечь список измененных строк. Можно вычислить пересечение этого для каждого файла со строками, охваченными данными тестового покрытия. Если измененные строки не полностью входят в набор покрытых строк, то «новый» код не тестировался, и вы можете поднять флаг, остановить регистрацию или что-то еще, чтобы сигнализировать о том, что ваша политика проверки была нарушена.

Инструменты TestCoverage и SmartDifferencer не поставляются в готовом виде с этим вычислением, сделанным за вас, но это должен быть довольно простой сценарий для реализации.

person Ira Baxter    schedule 02.03.2011
comment
Не могли бы вы просто сказать, что соотношение непокрытый:покрытый код не должно опускаться ниже текущего значения, вместо того, чтобы пытаться обнаружить, что такое новый код? Я думаю, что определить, что такое новый код, сложно, поскольку добавленный файл может быть просто переименованным файлом в SVN (что является удалением и добавлением). - person Stephen Paulger; 25.03.2011
comment
Вы можете сделать это тривиально с помощью любого инструмента тестового покрытия, который даст вам соотношение (как это делает наш). Но я не вижу в этом смысла: вы просто заставите программистов играть в систему, и когда пороги станут слишком низкими, они пойдут писать тесты для какого-то старого простого кода, который уже работает, чтобы повысить коэффициент, а не для нового. код, который они только что представили. - person Ira Baxter; 25.03.2011
comment
Жаль, что инструменты Smart Differer не поддерживают python. - person Stephen Paulger; 25.03.2011
comment
@StephenPaulger: Да. Python 2.6 и 3.1, другие диалекты, как мы видим спрос. Я думаю, вы говорите мне, что сайт устарел; у нас достаточно продуктов, так что это немного проблематично :-} - person Ira Baxter; 25.03.2011
comment
О, круто, не знаю, как я это пропустил. Пришло время еще раз проверить зрение. - person Stephen Paulger; 25.03.2011
comment
@StephenPaulger: Возможно, настоящий позор заключается в том, что у нас нет инструментов для тестового покрытия Python :-{ Мы можем их создать, просто пока не видим рынка. - person Ira Baxter; 25.03.2011

если вы используете maven - плагин cobertura может быть хорошим выбором (и не так раздражает разработчиков, как svn hook) http://mojo.codehaus.org/cobertura-maven-plugin/usage.html

person Dmytro    schedule 02.03.2011
comment
Я могу представить, как разработчики пропускают это очень легко и часто :S - person Nicolas Rodríguez Seara; 03.03.2011
comment
Обычно можно просто сказать: ребята, пожалуйста, запустите cobertura перед фиксацией и не забудьте написать тест. Обычные разработчики могут перестать делать дерьмовые коммиты, если вы их попросите :) По крайней мере, этот подход работал в нескольких командах, которые я знаю. - person Dmytro; 03.03.2011
comment
Хотя разработчики могут очень легко пропустить тесты maven, если у вас есть Jenkins (или другой инструмент CI), хорошо настроенный для запуска тестов перед сборкой программного обеспечения, даже если разработчики настаивают на пропуске тестов, CI предупредит команду, что сборка не работает. не работает, как ожидалось. - person Miere; 18.12.2012