«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/baeldung/algorithms/dijkstra/*</ignore>
            </ignores>
            <excludes>
                <exclude>com/baeldung/algorithms/dijkstra/*</exclude>
            </excludes>
        </instrumentation>
    </configuration>
</plugin>

Вот базовый пример того, как настроить фазу проверки:

При использовании флага haltOnFailure Cobertura приведет к сбою сборки, если одна из указанных проверок не пройдена.

<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.baeldung.algorithms.dijkstra.*</pattern>
                <branchRate>60</branchRate>
                <lineRate>50</lineRate>
             </regex>
        </regexes>
    </check>
</configuration>

Теги branchRate/lineRate указывают минимальный допустимый показатель покрытия ветвей/линий, требуемый после инструментирования кода. Эти проверки можно расширить до уровня пакета с помощью тегов packageLineRate/packageBranchRate.

Также можно объявить определенные проверки правил для классов с именами, соответствующими определенному шаблону, с помощью тега regex. В приведенном выше примере мы гарантируем, что для классов в пакете com.baeldung.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:

В качестве обходного пути вы можете загрузить старую версию JUnit и поместить ее в папку плагинов Eclipse.

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]

Это можно сделать, удалив папку org.junit.*** из %ECLIPSE_HOME%/plugins, а затем скопировав ту же папку из более старой установки Eclipse, совместимой с eCobertura.

После этого перезапустите Eclipse IDE и переустановите подключаемый модуль, используя соответствующий сайт обновлений.

3.3. Отчеты о покрытии кода в Eclipse

Чтобы рассчитать покрытие кода модульным тестом, щелкните правой кнопкой мыши свой проект/тест, чтобы открыть контекстное меню, затем выберите параметр «Покрыть как» → «JUnit Test».

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

Пользователи Java 8 могут столкнуться с распространенной ошибкой при расчете покрытия кода:

В этом случае Java жалуется на некоторые методы отсутствие надлежащей карты стека из-за более строгого верификатора байт-кода, введенного в более новых версиях Java.

java.lang.VerifyError: Expecting a stackmap frame at branch target ...

Эту проблему можно решить, отключив проверку в виртуальной машине Java.

Для этого щелкните проект правой кнопкой мыши, чтобы открыть контекстное меню, выберите «Обложка как», а затем откройте представление «Конфигурации покрытия». На вкладке аргументов добавьте флаг -noverify в качестве аргумента виртуальной машины. Наконец, нажмите кнопку покрытия, чтобы запустить расчет покрытия.

Вы также можете использовать флаг -XX:-UseSplitVerifier, но это работает только с Java 6 и 7, так как разделенный верификатор больше не поддерживается в Java 8.

4. Заключение

В этой статье мы кратко показали, как использовать Cobertura для расчета покрытия кода в проекте Java. Мы также описали шаги, необходимые для установки eCobertura в вашей среде Eclipse.

Cobertura — отличный, но простой инструмент для покрытия кода, но он не поддерживается активно, поскольку в настоящее время его превосходят более новые и более мощные инструменты, такие как JaCoCo.

Наконец, вы можете проверить пример, приведенный в этой статье, в проекте GitHub.

«