1. Обзор
В этой статье мы продемонстрируем несколько аспектов генерации отчетов о покрытии кода с помощью Cobertura .
Проще говоря, Cobertura — это инструмент отчетности, который вычисляет покрытие тестами для кодовой базы — процент ветвей/строк, к которым обращаются модульные тесты в проекте Java.
2. Плагин Maven
2.1. Конфигурация Maven
Чтобы начать вычисление покрытия кода в вашем проекте Java, вам необходимо объявить подключаемый модуль Cobertura Maven в вашем файле pom.xml
в разделе отчетности:
<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.7</version>
</plugin>
</plugins>
</reporting>
Вы всегда можете проверить последнюю версию плагина в центральном репозитории Maven .
После этого запустите Maven, указав cobertura:cobertura
в качестве цели.
Это создаст подробный отчет в стиле HTML, показывающий статистику покрытия кода, собранную с помощью инструментария кода:
Метрика покрытия строк показывает, сколько операторов выполняется при запуске модульных тестов, а метрика покрытия ветвей фокусируется на том, сколько ветвей охвачено этими тестами .
Для каждого условного предложения у вас есть две ветви, так что, по сути, у вас будет в два раза больше ветвей, чем для условных выражений.
Фактор сложности отражает сложность кода — он увеличивается с увеличением количества ветвей в коде.
Теоретически, чем больше у вас веток, тем больше тестов вам нужно реализовать, чтобы увеличить показатель покрытия веток.
2.2. Настройка расчета покрытия кода и проверок
Вы можете игнорировать/исключать определенный набор классов из инструментовки кода, используя теги ignore
и exclude :
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.7</version>
<configuration>
<instrumentation>
<ignores>
<ignore>com/foreach/algorithms/dijkstra/*</ignore>
</ignores>
<excludes>
<exclude>com/foreach/algorithms/dijkstra/*</exclude>
</excludes>
</instrumentation>
</configuration>
</plugin>
После расчета покрытия кода наступает фаза проверки .
Этап проверки
обеспечивает достижение определенного уровня покрытия кода .
Вот базовый пример того, как настроить фазу проверки :
<configuration>
<check>
<haltOnFailure>true</haltOnFailure>
<branchRate>75</branchRate>
<lineRate>85</lineRate>
<totalBranchRate>75</totalBranchRate>
<totalLineRate>85</totalLineRate>
<packageLineRate>75</packageLineRate>
<packageBranchRate>85</packageBranchRate>
<regexes>
<regex>
<pattern>com.foreach.algorithms.dijkstra.*</pattern>
<branchRate>60</branchRate>
<lineRate>50</lineRate>
</regex>
</regexes>
</check>
</configuration>
При использовании флага haltOnFailure
Cobertura приведет к сбою сборки в случае сбоя одной из указанных проверок.
Теги branchRate /lineRate
указывают минимально допустимую оценку покрытия ветвей/линий, требуемую после инструментирования кода. Эти проверки можно расширить до уровня пакета с помощью тегов packageLineRate/packageBranchRate
.
Также можно объявить определенные проверки правил для классов с именами, соответствующими определенному шаблону, с помощью тега regex .
В приведенном выше примере мы гарантируем, что для классов в пакете com.foreach.algorithms.dijkstra
и ниже должна быть достигнута определенная оценка покрытия линии/ветви .
3. Плагин Eclipse
3.1. Монтаж
Cobertura также доступна в виде подключаемого модуля Eclipse под названием eCobertura
. Чтобы установить eCobertura
для Eclipse, вам необходимо выполнить следующие шаги и установить Eclipse версии 3.5 или выше:
Шаг 1: В меню Eclipse выберите « Справка»
→ « Установить новое программное обеспечение
» . Затем при работе с
полем введите http://ecobertura.johoop.de/update/
:
Шаг 2: Выберите eCobertura Code Coverage
, нажмите «Далее» и следуйте инструкциям мастера установки.
Теперь, когда eCobertura
установлена, перезапустите Eclipse и отобразите представление сеанса покрытия в Windows → Показать представление → Другое → Cobertura
.
3.2. Использование Eclipse Kepler или более поздней версии
Для более новой версии Eclipse (Kepler, Luna и т. д.) установка eCobertura
может вызвать некоторые проблемы, связанные с JUnit — более новая версия JUnit, упакованная с Eclipse, не полностью совместима с проверкой зависимостей eCobertura
:
Cannot complete the install because one or more required items could not be found.
Software being installed: eCobertura 0.9.8.201007202152 (ecobertura.feature.group
0.9.8.201007202152)
Missing requirement: eCobertura UI 0.9.8.201007202152 (ecobertura.ui
0.9.8.201007202152) requires 'bundle org.junit4 0.0.0' but it could not be found
Cannot satisfy dependency:
From: eCobertura 0.9.8.201007202152
(ecobertura.feature.group 0.9.8.201007202152)
To: ecobertura.ui [0.9.8.201007202152]
В качестве обходного пути вы можете загрузить старую версию JUnit и поместить ее в папку плагинов Eclipse.
Это можно сделать, удалив папку org.junit.***
из %ECLIPSE_HOME%/plugins
, а затем скопировав ту же папку из более старой установки Eclipse, совместимой с eCobertura
.
После этого перезапустите Eclipse IDE и переустановите подключаемый модуль , используя соответствующий сайт обновлений.
3.3. Отчеты о покрытии кода в Eclipse
Чтобы рассчитать покрытие кода модульным тестом, щелкните правой кнопкой мыши свой проект/тест, чтобы открыть контекстное меню, затем выберите параметр « Обложка как» → «Тест JUnit»
.
В представлении « Сеанс покрытия
» вы можете проверить отчет о покрытии линии/ветки для каждого класса:
Пользователи Java 8 могут столкнуться с распространенной ошибкой при расчете покрытия кода:
java.lang.VerifyError: Expecting a stackmap frame at branch target ...
В этом случае Java жалуется на то, что некоторые методы не имеют надлежащей карты стека из-за более строгого верификатора байт-кода, введенного в более новых версиях Java.
Эту проблему можно решить, отключив проверку в виртуальной машине Java.
Для этого щелкните проект правой кнопкой мыши, чтобы открыть контекстное меню, выберите « Обложка как
», а затем откройте представление « Конфигурации покрытия
» . На вкладке аргументов добавьте флаг -noverify
в качестве аргумента виртуальной машины. Наконец, нажмите кнопку покрытия
, чтобы запустить расчет покрытия.
Вы также можете использовать флаг -XX:-UseSplitVerifier
, но это работает только с Java 6 и 7, так как разделенный верификатор больше не поддерживается в Java 8.
4. Вывод
В этой статье мы кратко показали, как использовать Cobertura для расчета покрытия кода в проекте Java. Мы также описали шаги, необходимые для установки eCobertura
в вашей среде Eclipse.
Cobertura — отличный, но простой инструмент для покрытия кода, но он не поддерживается активно, поскольку в настоящее время его превосходят более новые и более мощные инструменты, такие как JaCoCo .
Наконец, вы можете ознакомиться с приведенным в этой статье примером в проекте GitHub .