Обеспечить минимальное покрытие новых коммитов Subversion
У нас масштабный проект, в котором практически нет юнит-тестов. Теперь я хотел бы убедиться, что разработчики предоставляют новые функции (или ошибки!) Без минимального покрытия для соответствующих модульных тестов.
Какие есть способы обеспечить это?
Мы используем много инструментов, поэтому, возможно, я могу использовать плагин (jira, greenhopper, fisheye, sonar, hudson). Я также подумал, что, может быть, pre-commit хук Subversion, плагин Commit Acceptance для jira или что-то подобное.
Мысли?
3 ответа
Sonar (кстати, замечательный инструмент) с плагином Build Breaker может сломать вашу сборку Hudson, если некоторые метрики не соответствуют заданным правилам. Вы можете настроить такое правило в Sonar, которое будет вызывать оповещение (в конечном итоге приводящее к сбою сборки), когда покрытие будет ниже заданной точки. Единственным недостатком является то, что вы, вероятно, хотите, чтобы охват увеличился, поэтому вы должны помнить, чтобы каждый день увеличивать уровень оповещения до текущего значения.
Что вы хотите сделать, это определить, что такое новый код, и убедиться, что новый код покрыт каким-то тестом.
Определение покрытия кода в целом может быть выполнено с помощью любого из множества инструментов покрытия теста. Многие инструменты покрытия тестами могут просто переустанавливать все ваше приложение, а затем вы можете запускать тесты для определения покрытия.
Наша (Semantic Designs) линейка инструментов покрытия тестов может определять из списка измененных файлов только отдельные файлы, которые необходимо повторно оборудовать, а при тщательной организации тестов - только те тесты, которые необходимо выполнить повторно. Это сведет к минимуму стоимость повторного запуска ваших тестов, и вы по-прежнему получите те же общие данные о покрытии. (На самом деле, эти инструменты определяют, какие тесты необходимо выполнить, основываясь на изменениях на уровне методов).
Если у вас есть данные о тестовом покрытии, вам нужно знать, что конкретно новый код покрывается некоторыми тестами. Вы можете сделать это небрежно, просто протестировав данные покрытия, если вы знаете, какие файлы были изменены, настаивая на том, что измененные файлы имеют 100% покрытие. Это, вероятно, не работает на практике.
Вместо этого вы можете воспользоваться инструментами SD Smart Differencer, чтобы дать более точный ответ. Эти инструменты сравнивают два языковых файла и указывают, где изменения используют синтаксис языка (например, выражение, оператор, объявление, тело метода, а не только измененные исходные строки) и концептуальные операции редактирования (перемещение, копирование, удаление, вставка, переименование идентификатор-пределы-блока). Дельты SmartDifferencer имеют тенденцию быть как меньшими, так и более мелкими, чем то, что вы получили бы от простого инструмента сравнения.
Из вывода SmartDifferencer легко извлечь список измененных строк. Можно рассчитать пересечение этого для каждого файла со строками, покрытыми данными тестового покрытия. Если измененные строки не полностью находятся в пределах набора покрытых строк, то "новый" код не был протестирован, и вы можете поднять флаг, остановить проверку или что-то еще, чтобы сигнализировать, что ваша политика проверки была нарушена.
Инструменты TestCoverage и SmartDifferencer не выходят из коробки с этим вычислением, выполненным для вас, но это должен быть довольно простой для реализации сценарий.
Если вы используете maven - плагин cobertura может быть хорошим выбором (и не настолько раздражающим для разработчиков, как svn hook) http://mojo.codehaus.org/cobertura-maven-plugin/usage.html