2016-11-11 8 views
0

Когда я запускаю модульные тесты с агентом Jacoco, есть некоторое несоответствие между моим местным докладом Jacoco и покрытием SonarQube. Похоже, что это влияет только на файлы, содержащие вложенные классы. Отчет, созданный локально, содержит информацию о покрытии для внешнего класса и всех внутренних классов, но данные покрытия на SonarQube включают только внутренние классы.Покрытие SonarQube отсутствует в некоторых строках, на которые ссылается отчет Jacoco

Например, Foo.java содержит внешний класс, Foo и внутренние классы, Bar и Baz.

В моем локальном отчете показано покрытие 26% для класса Foo, 46% для класса Foo.Bar и 0% для класса Foo.Baz; общий охват обучения для Foo.java составляет 30%. Страница покрытия SonarQube дает покрытие линии 15% для Foo.java. Я понимаю, что покрытие линии не соответствует охвату инструкций, но я бы ожидал, что цифры будут ближе. При дальнейшей проверке я заметил, что в файловом обзоре Foo.java на SonarQube все строки во внешнем классе Foo отмечены как «Не охвачены модульными тестами», а единственными строками, отмеченными закрытыми, являются те, что указаны в Foo Я ожидал. Это различие составляет примерно 15% разрыв между докладом Jacoco и SonarQube. Я не вижу никаких исключений в локальных журналах сканера или журналах анализа сервера.

Я работаю с JaCoCo 0.7.7.201606060606, Java версии 1.8.0_73 и сонар-сканером 2.8 локально. На сервере запущена версия Java версии 1.8.0_66-b17, версия SonarQube версии 5.6.3 и версия плагина SonarQube Java 4.2.1.6971.

Я был бы признателен за любые предложения и был бы рад предоставить более подробную информацию, если бы это было полезно.

ответ

0

Оказывается, что файлы классов, используемые для запуска модульных тестов (которые также используются для генерации моего локального отчета), отличаются от файлов классов, используемых сонар-сканером. Это связано с тем, что после компиляции, модульных тестов и создания локального отчета bnd запускается над файлами классов и перезаписывает файлы классов классов @Component. Поскольку сонар-сканер запускается после bnd, он видит разные файлы классов. Похоже, что моя проблема не была внутренним и внешним классами, а скорее компонентами OSGi и не-компонентами; класс Foo - это компонент OSGi, а внутренние классы - нет.

Когда я запускаю сканер над теми же файлами классов, которые используются агентом Jacoco, покрытие линии Foo.java, сообщенное SonarQube, составляет 27% (вместо 15%), а вид покрытия на основе файлов соответствует моему локальному отчет.

1

Сравнение «инструкций» с чем-либо еще похоже на сравнение яблок и апельсинов - они не представляют одно и то же. Одиночная строка кода обычно содержит много инструкций байткода. И поэтому неправильно ожидать, что «покрытие инструкций» будет близко к «охвату линии», например: если в общей сложности у вас есть 100 инструкций в 10 строках и 1 строка с 20 инструкциями, то пропущенные инструкции 80%, но пропущенные строки 90%.

См. http://www.eclemma.org/jacoco/trunk/doc/counters.html о прилавках, которые предоставляет JaCoCo. И http://docs.sonarqube.org/display/SONAR/Metric+Definitions о том, что показывает SonarQube. Покрытие инструкций представлено только в JaCoCo.

И непонятно из вашего вопроса, если вы видите разницу между закрытыми линиями в Foo.java, показанные SonarQube и показаны JaCoCo. Если да, то, пожалуйста, предоставьте скриншот.

+0

Спасибо за указатели и за отзыв! Я понимаю, что ожидается, что покрытие линий и инструкций будет отличаться. Большую озабоченность вызывают различия в покрытых линиях в SonarQube и JaCoCo для Foo.java. Оказывается, они использовали разные файлы классов для выполнения анализа, как я объясняю в своем ответе. Извините, что беспокою вас! –

 Смежные вопросы

  • Нет связанных вопросов^_^