Введение в Кобертуру

Введение в Кобертуру

1. обзор

В этой статье мы продемонстрируем несколько аспектовgenerating code coverage reports using Cobertura.

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

2. Maven Plugin

2.1. Конфигурация Maven

Чтобы начать вычисление покрытия кода в вашем Java-проекте, вам необходимоdeclare the Cobertura Maven plugin in your pom.xml file в разделе отчетов:


    
        
            org.codehaus.mojo
            cobertura-maven-plugin
            2.7
        
    

Вы всегда можете проверить последнюю версию плагина в папкеMaven central repository.

После этого запустите Maven, указав в качестве целиcobertura:cobertura.

Это создаст подробный отчет в стиле HTML со статистикой покрытия кода, собранной с помощью инструментария кода:

image

The line coverage metric shows how many statements are executed в модульных тестах, аthe branch coverage metric focuses on how many branches are covered by those tests.

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

The complexity factor reflects the complexity of the code - возрастает при увеличении количества ветвей в коде.

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

2.2. Настройка расчета и проверки покрытия кода

Вы можете игнорировать / исключать определенный набор классов из инструментария кода, используя тегиignore иexclude:


    org.codehaus.mojo
    cobertura-maven-plugin
    2.7
    
        
            
                com/example/algorithms/dijkstra/*
            
            
                com/example/algorithms/dijkstra/*
            
        
    

После расчета покрытия кода наступает фазаcheck. The check phase ensures that a certain level of code coverage is reached.

Вот базовый пример настройки фазыcheck:


    
        true
        75
        85
        75
        85
        75
        85
        
            
                com.example.algorithms.dijkstra.*
                60
                50
             
        
    

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

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

Также можно объявить определенные проверки правил для классов с именами, соответствующими определенному шаблону, используя тегregex. В приведенном выше примере мы гарантируем, что для классов в пакетеcom.example.algorithms.dijkstra и ниже должен быть достигнут определенный показатель охвата линии / ответвления.

3. Eclipse Plugin

3.1. Монтаж

Cobertura также доступна как плагин Eclipse под названиемeCobertura. Чтобы установитьeCobertura для Eclipse, вам необходимо выполнить следующие шаги и установить Eclipse версии 3.5 или выше:

Step 1: В меню Eclipse выберитеHelpInstall New Software. Затем в полеwork with введитеhttp://ecobertura.johoop.de/update/:

image

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

Теперь, когдаeCobertura установлен, перезапустите Eclipse и покажите представление сеанса покрытия подWindows → Show View → Other → Cobertura.

image

3.2. Использование Eclipse Kepler или более поздней версии

Для более новой версии Eclipse (Kepler, Luna и т. Д.) УстановкаeCobertura может вызвать некоторые проблемы, связанные с JUnit -the newer version of JUnit packaged with Eclipse is not fully compatible with eCobertura‘s dependencies checker:

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.

После этогоrestart your Eclipse IDE and re-install the plugin использует соответствующий сайт обновления.

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

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

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

image

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

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

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

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

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

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

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

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

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

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