Sonar + JaCoco, не считая кода Groovy, как покрыто

У меня есть класс Groovy с одним статическим методом:

class ResponseUtil {
    static String FormatBigDecimalForUI (BigDecimal value){
        (value == null || value <= 0) ? '' : roundHalfEven(value)
    }
}

У него есть тестовый пример или несколько:

@Test
void shouldFormatValidValue () {
    assert '1.8' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(1.7992311))
    assert '0.9' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(0.872342))
}

@Test
void shouldFormatMissingValue () {
    assert '' == ResponseUtil.FormatBigDecimalForUI(null)
}

@Test
void shouldFormatInvalidValue () {
    assert '' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(0))
    assert '' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(0.0))
    assert '' == ResponseUtil.FormatBigDecimalForUI(new BigDecimal(-1.0))
}

Это приводит к 6/12 веткам, покрытым согласно Sonar / JaCoCo:

Покрытие половинного кода

Поэтому я изменил код, чтобы он был более ... подробным. Я не думаю, что исходный код «слишком умен» или что-то в этом роде, но я сделал его более явным и ясным. Итак, вот оно:

static String FormatBigDecimalForUI (BigDecimal value) {
    if (value == null) {
        ''
    } else if (value <= 0) {
        ''
    } else {
        roundHalfEven(value)
    }
}

И теперь, ничего не меняя, Sonar / JaCoCo сообщает, что это полностью покрыто:

100% покрытие JaCoCo

Почему это так?


person Mike    schedule 19.06.2012    source источник
comment
Я предполагаю, что это ошибка в Sonar / JaCoCo, поскольку оба этих метода производят очень похожий байт-код, насколько я могу видеть ...   -  person tim_yates    schedule 19.06.2012
comment
Я испытал то же самое, как выглядит покрытие кода в Cobertura, и он дает точно такие же результаты. Наполовину протестировано на однолинейной версии и полностью протестировано на расширенной версии. Это ... относительно.   -  person Mike    schedule 19.06.2012
comment
Я разместил два сгенерированных байт-кода здесь, они оба мне нравятся (но очевидно, что мульти- строчный код вызывает areturn больше, чем однострочная версия) ... Вероятно, есть люди, которые столкнулись с этой проблемой (и нашли обходные пути) в списке рассылки Groovy User ... Я бы попробовал отправить электронное письмо и посмотреть, есть ли у кого-нибудь видел это раньше?   -  person tim_yates    schedule 19.06.2012
comment
Извините, что откопал старый вопрос, но мне интересно, как вы используете вместе Groovy, Jacoco и Sonar. Это единственное упоминание о совместной работе этой комбинации.   -  person B Jammin    schedule 05.12.2012
comment
Я думаю, что мы так и не стали использовать JaCoCo. Однако мы используем Sonar с Groovy и Cobertura.   -  person Mike    schedule 10.12.2012


Ответы (2)


Я не знаю, применимо ли это к вашему конкретному примеру, но имейте в виду, что инструменты покрытия кода обычно не работают для альтернативных языков JVM, если они не поддерживают их явно. Это связано с тем, что практически все эти языки генерируют дополнительный байтовый код, который может выполняться только в определенных случаях. Например, Groovy может генерировать байтовый код для медленного и быстрого пути и автоматически выбирать между ними без участия пользователя.

Ситуация может улучшиться с Groovy 3.0, который будет разработан на основе Java invokedynamic, а это означает, что придется генерировать меньше «магического» байтового кода. Между тем я слышал, что Clover имеет явную поддержку Groovy, хотя не знаю, насколько она актуальна.

person Peter Niederwieser    schedule 20.06.2012

Итак, как оказалось, плагин Jacoco для Sonar явно ищет код Java. Я знаю это, поскольку отлаживал через это. Он декодирует файл jacoco exec и предполагает, что любой файл является файлом JavaFile, который он не находит, а затем сообщает, что у вас нет информации о покрытии.

Из-за этого я взял исходный код плагина Jacoco (он исчез из их репозитория Subversion и никогда не появлялся на Github, который я мог найти) и сложил его в новый плагин Groovy. Мой обновленный использует Codenarc 0.18.1 (который увеличивает Narc с 32 до 305) и распознает любые файлы Jacoco - код в существующем плагине излишне неверен.

Источник здесь: https://github.com/rvowles/sonar-groovy - просто создайте его и поместите в каталог расширений / плагинов.

person Richard Vowles    schedule 11.05.2013