Перейти к основному содержимому

Знакомство с Кобертурой

· 5 мин. чтения

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, показывающий статистику покрытия кода, собранную с помощью инструментария кода:

./3735ebbc3aff9e6f24278f6a54b1ceab.png

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

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

Фактор сложности отражает сложность кода — он увеличивается с увеличением количества ветвей в коде.

Теоретически, чем больше у вас веток, тем больше тестов вам нужно реализовать, чтобы увеличить показатель покрытия веток.

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/ :

./6c9e4680ef1a16e467d0ed975286f61a.png

Шаг 2: Выберите eCobertura Code Coverage , нажмите «Далее» и следуйте инструкциям мастера установки.

Теперь, когда eCobertura установлена, перезапустите Eclipse и отобразите представление сеанса покрытия в Windows → Показать представление → Другое → Cobertura .

./72c298143d024df1d2727db23b937e21.png

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» .

В представлении « Сеанс покрытия » вы можете проверить отчет о покрытии линии/ветки для каждого класса:

./4cf735a679e54a2059dbfbc56ba3b11c.png

Пользователи 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 .