Сонар не обнаруживает покрытие кода после успешной сборки с помощью плагина Jenkins Sonar

Я пытаюсь получить код с помощью Sonar и Jenkins. Я вижу, что плагин Sonar Jenkins успешно выполняет тестовые примеры JUnit и успешно завершает сборку. Но Sonar не показывает результаты Code Coverage (всегда показывает 0.0% в качестве покрытия кода) в проекте. Но Sonar действительно показывает "Unit test успех".

Я использую Maven с Дженкинсом и Сонаром.

Я получаю сообщение ниже в журналах Jenkins во время выполнения плагина Sonar:

Project coverage is set to 0% as no JaCoCo execution data has been dumped: .../sonar/target/jacoco.exec

Может ли кто-нибудь помочь мне получить правильное покрытие кода в любом проекте Sonar.

Ответ 1

Я читал https://docs.sonarqube.org/display/PLUG/Code+Coverage+by+Unit+Tests+for+Java+Project и использовал cobertura в качестве моего плагина для покрытия кода, после чего я вижу экраны покрытия кода для небольших проектов. Когда я проверяю большой проект в гидролокаторе, я просто вижу покрытие кода как - это означает, что он пуст. В журналах я мог обнаружить, что отчет Cobertura не найден на пути /.../coverage.xml.

cover.xml не был создан из-за OutOfMemeryError: heapspace. Поскольку мой проект - такой большой проект, когда я устанавливаю память кучи на 2 ГБ, а память плагина cobertura - на 1,5 Гбайт сонара, отображается отображение кода.

Ответ 2

Просто потому, что Sonar правильно вызвал Surefire (и вы получили сообщение "Unit test success" ) не означает, что JaCoCo измерил ваш код.

Попробуйте выполнить JaCoCo напрямую. Вы можете узнать, почему JaCoCo не работает напрямую:

mvn jacoco:prepare-agent test jacoco:report

JaCoCo поместит jacoco.exec, а также его отчеты XML/HTML в target/jacoco. Или это провалится, и, надеюсь, у вас будет лучшая идея относительно того, почему.

Одна очень распространенная проблема заключается в том, что javaagent JaCoCo не запускается, если вы вообще изменили строку аргумента Surefire, потому что jacoco:prepare-agent просто устанавливает свойство argLine, которое в этом сценарии удобно игнорировать. Вы можете установить свойство prepare-agent propertyName в нечто другое (например, jacocoArgLine) и включить его в конфигурацию argLine:

<argLine>-Xmx1024m ${jacocoArgLine}</argLine>

Ответ 3

Вместо использования плагина сонара Jenkins для запуска сонара, попробуйте сделать это с помощью maven, выполнив цель сонара. Обычно это проще, чем настраивать дополнительный шаг сборки и настраивать все пути до тех пор, пока сонар не найдет все соответствующие файлы.

В вашем случае, я думаю, он может читать отчет junit/testng, но не может найти результаты jacoco (jacoco.exec). Правильны ли выходы сонара пути (../sonar/target/jacoco.exec)?

Ответ 4

В соответствии с этим сообщением , вы, вероятно, забыли установить свойство sonar.binaries в свойствах проекта

Не забывайте о sonar.binaries, иначе вы можете получить что-то вроде "Покрытие проекта установлено на 0%, так как нет каталогов с классами." В ваших журналах.

[...]
sonar.surefire.reportsPath=target/surefire-reports
sonar.jacoco.reportPath=target/jacoco.exec
sonar.binaries=target/classes
[...]