Jacoco: найти покрытие кода для внешних тестов

Недавно я использовал плагин EclEmma в eclipse, чтобы найти покрытие кода JUnits в моем приложении, и он отлично работал.

На следующем этапе я хочу найти покрытие кода для сквозных/функциональных тестов, которые вызываются в нашем приложении извне (они находятся на отдельном сервере).

По сути, мы упаковываем наше приложение в виде jar-файла (мы используем maven) и развертываем его на сервере. И мы можем запустить функциональные тесты в этом месте.

Есть ли способ определить покрытие кода в этом случае?

Мое понимание того, как работает инструмент покрытия кода (в сыром виде), заключается в том, что он загружает классы и создает отчет на основе части кода, которая была затронута. Итак, согласно этому пониманию, мне не нужен доступ к тестовому коду. Мне нужно только каким-то образом подключить инструмент покрытия кода к моей банке приложения, и всякий раз, когда вызывается любой код в этой банке, отчет будет обновляться. Правильно ли я понимаю?

ПРИМЕЧАНИЕ. Я открыт для использования другого инструмента покрытия кода, если это возможно с другими инструментами.


person tryingToLearn    schedule 02.05.2018    source источник
comment
Я считаю, что ваше понимание внешних тестов ошибочно. Покрытие кода — это показатель покрытия разработчиком тестов. Тестирование QA должно проверять код на соответствие требованиям; в основном этот вход генерирует эту активность в программном обеспечении, как показано на этом выходе.   -  person DwB    schedule 04.05.2018
comment
Суть в том, что мы хотим быть уверены, что максимальная часть нашего кода была затронута тестами, независимо от характера тестов перед отправкой клиенту.   -  person tryingToLearn    schedule 04.05.2018
comment
Затем выполните модульные тесты, чтобы покрыть код.   -  person DwB    schedule 04.05.2018
comment
@DwB Отчет о покрытии кода из тестов более высокого уровня - даже из ручных тестов или даже из периода реального использования - информативен и полезен. Вы не должны использовать % покрытия в качестве метрики. Но вы можете просмотреть отчеты и увидеть что-то вроде «Эй, почему этот метод никогда не выполняется?»; «А, смотрите, наш переключатель функций работает», «Хм, этот бит никогда не должен срабатывать» и т. д.   -  person slim    schedule 04.05.2018
comment
@slim, что в значительной степени отражает мои намерения   -  person tryingToLearn    schedule 04.05.2018


Ответы (3)


Вы можете запустить свой код на сервере, оснащенном во время выполнения агентом JaCoCo, добавив агент в командную строку Java. Например, если ваш процесс в настоящее время запущен с помощью:

java -jar myApp.jar

Вы можете изменить его на

java -jar myApp.jar -javaagent:/some/path/jacocoagent.jar

По умолчанию это будет записывать данные о покрытии в файл jacoco.exec при завершении работы виртуальной машины, но вы можете переопределить это с помощью параметров, что позволит вам получать данные о покрытии через TCP/IP. См. документацию JaCoCo Agent.

Вы можете отформатировать это в отчет (например, HTML), используя:

java -jar jacococli.jar report jacoco.exec [options]

Варианты см. в документах по интерфейсу командной строки JaCoCo.

... или вы можете использовать EclEmma для анализа вывода.

Если есть серьезные причины, по которым вы не можете использовать агент, в крайнем случае вы можете статически преобразовать файлы классов в инструментированные файлы классов, используя команду instrument в jacocococli. Информацию об этом см. в документации JaCoCo "Offline Instrumentation".

Непосредственный вызов агента и использование jacococli.jar — самые простые способы использования JaCoCo. Поскольку вы используете Maven, вы можете получить многие из тех же эффектов с помощью плагина JaCoCo Maven.

person slim    schedule 04.05.2018
comment
Означает ли это, что нет необходимости перехватывать jacoco во время компиляции? Его можно зацепить на лету? - person tryingToLearn; 04.05.2018
comment
Да; Я не уверен, как ответ может прояснить это. - person slim; 04.05.2018
comment
Но в моем случае jar не является исполняемым jar и сами функциональные тесты вызывают соответствующую часть кода. Вот почему я искал способ подключить jacoco во время компиляции. - person tryingToLearn; 04.05.2018
comment
Вы все равно где-то запускаете Java. Например, если вы работаете в Tomcat, добавьте агент в команду java в сценариях запуска Tomcat. - person slim; 04.05.2018
comment
Спасибо. Я попробовал это, и это сработало с несколькими настройками. Созданный отчет нельзя было просмотреть непосредственно в Eclemma, т. е. не отображались покрытия. (Было бы здорово, если бы я мог сделать эту работу). Даже предоставление файлов классов, созданных maven, которые использовались для создания jar, не сработало. (jacoco-cli выдал предупреждение о том, что выполнение env отличается) Мне пришлось извлечь application.jar и указать путь к извлеченным файлам классов, чтобы получить отчет. Я что-то пропустил или так и должно быть? - person tryingToLearn; 08.05.2018

Вот как я сделал это с maven в конвейере jenkins

mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent test -Dmaven.test.failure.ignore=true 

Это создаст target/jacoco.exec с данными о покрытии кода.

Очевидно, что мы не можем интерпретировать вывод, но такие инструменты и плагины, как SonarQube, могут это сделать (в моем случае я использовал sonarqube).

Однако вы можете использовать ниже для создания в формате html/csv, который будет расположен в target/site/jacoco/index.html , target/site/jacoco/jacoco.csv

mvn org.jacoco:jacoco-maven-plugin:report OR

java -jar jacococli.jar report jacoco.exec [options]

Кроме того, вы можете обратиться к этому руководству, в котором все это было сделано в pom.xml

person codereal    schedule 08.05.2018
comment
Я думаю, вы запускаете тесты из maven. Мои тесты находятся снаружи и выполняются независимо без maven. - person tryingToLearn; 08.05.2018

Я была такая же проблема. Вот как я исправил это локально. Добавляя агент jacoco в vm args. Кроме того, после версии jacoco 6.1 файл exec создается в начале (пустой), а затем заполняется после корректного завершения работы сервера, чего, по-видимому, не делает eclipse. Итак, мы получаем пустой файл .exec. Ключевым моментом является добавление output=tcpserver, а затем импортирование покрытия кода.

-javaagent:C:\Users\JohnDoe\Downloads\jacoco-0.8.5\lib\jacocoagent.jar=output=tcpserver.

Импортируйте результаты в Eclipse. Это делается из меню «Файл» -> «Импорт» -> «Сеанс покрытия» -> выберите радиокнопку «Адрес агента», но оставьте значения по умолчанию -> введите имя и выберите тестируемый код. По умолчанию должно быть 127.0.0.1 с портом 6300.

person Mayur    schedule 04.05.2021