Охват кода кода только по новому коду

Мы ищем творческий способ измерения охвата кода новым кодом отдельно от существующего кода. У нас есть большой старый проект и мы хотим начать получать 90%% от любых новых функций. Мы хотели бы легко просмотреть отчет, который отфильтровывает любой старый код, чтобы убедиться, что новая функциональность соответствует нашей цели. Очевидно, что все еще смотря на все более широкое освещение проекта, но нам нужен не-ручной способ дать нам отзывы о новой активности кода. У нас это работает для статического анализа, так как мы можем посмотреть даты в исходных файлах. Поскольку Cobertura анализирует файлы классов, у них есть новые даты, и этот метод не работает.

Любые идеи?

Стек:

Java 1.5 JUnit Cobertura Хадсон

Ответ 1

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

У нас есть файл с именем linecoverage.standard и файл с именем branchcoverage.standard, который живет на сервере сборки (и локальных копиях). У них есть номер внутри с линией и линией покрытия. Если проверенный код ниже стандарта, он не выполняет сборку. Если он соответствует стандарту, он передает сборку. Если это ВЫШЕ стандарт, новый стандарт записывается равным текущему охвату.

Это означает, что наше покрытие кода никогда не будет ухудшаться и должно медленно повышаться. Если новый код составляет 90%, охват будет продолжаться. Вы также можете установить цель, например, повышать стандарт на 1 каждую неделю, пока не достигнете конечной цели (90%). Чтобы добавить несколько тестов в неделю к старому коду, это неплохая идея, если она распределена за достаточное время.

Наше текущее покрытие составляет до 75% иш... довольно неплохо, исходя из ставки 0% в год меньше.

Ответ 2

Посмотрите emma.sourceforge и связанный с ним плагин Eclipse здесь (если вы используете Eclipse)

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

Ответ 3

Я сделал это для большого проекта С++, используя svn blame в сочетании с выходом gcov. Если вы заархивируете эти два результата вместе, у вас есть информация о ревизии и информация о покрытии для каждой строки. Я действительно загрузил все это в базу данных, чтобы делать запросы (например, покажите мне все непокрытые строки, написанные joe с r1234). Если вам нужен только совокупный номер, вы можете просто не рассчитывать "старые" непокрытые строки в общей сумме.

Ответ 4

ИМО лучший вариант - разбить базу кода на "новые" и "устаревшие" разделы. Затем либо запустите анализ тестового покрытия только в разделе "новый", либо проигнорируйте результаты для "старого" раздела.

Двумя лучшими способами для этого являются: a) разделение базы кода на два дерева источников (два проекта с зависимостью) или b) поддержка двух отдельных иерархии пакетов в одном проекте.

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

Как только вы это сделаете, настройте cobertura так, чтобы он анализировал только нужные вам биты или, по крайней мере, просто сосредоточился на "новой" части кода. Еще один совет заключается в том, что в этой схеме лучше всего переместить биты кода из раздела "наследие" в "новый" раздел, когда вы рефакторируете/добавляете к ним тесты (если код часто перемещается в другом направлении, это не так хорошо: -).

Ответ 5

Мы сделали это как показано ниже с помощью свойства sonar.exclusions: Мы используем Sonar для отображения отчетов о покрытии кода (сообщается Cobertura).

a) Определите классы, на которые вы не хотите получать отчет о покрытии (классы Legacy) Используйте ваш SCM-клиент.     например: p4 файлы //depot/... @2000/01/01, @2013/07/13             git log --until = "5 дней назад"

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

eg. the destination file is excludeFile.list should look like below:
abc.java
xyz.java
...

b) Теперь... когда вы интегрируетесь с Sonar (из Jenkins Job), используйте свойство ниже.

    -Dsonar.exclusions=<filename>

И ваш окончательный отчет о покрытии в Sonar содержит только ваши новые классы (добавленные после 07/13 в приведенном выше примере).

Ответ 6

Мы называем то, что вы пытаетесь сделать, Анализ пробела в пробах. Идея состоит в том, чтобы протестировать все (или, по крайней мере, большинство) изменений, которые вы вносите в большую программную систему во время разработки, потому что именно там будет больше ошибок. Эмпирические доказательства также подтверждают эту интуицию!

Teamscale - это инструмент, который делает то, что вы ищете, и он может обрабатывать отчеты Cobertura. Преимущество заключается в том, что вы просто измеряете охват, как обычно, а затем загружаете отчеты в Teamscale, который выполнит анализ пробела, чтобы выделить новый/измененный, но непроверенный код для каждого метода.

Полный отказ от ответственности: я работаю в CQSE, компании, которая делает Teamscale.