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 съобщават, че е напълно покрито:

JaCoCo 100% покритие

Защо е така?


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