При использовании Cobertura с кодом Gradle и Groovy сообщается о необычно низком охвате тестированием

Я разрабатываю плагин Gradle и пытаюсь настроить свой проект так, чтобы я мог получать метрики покрытия кода для него. У меня есть модульные и интеграционные тесты, основанные на фреймворке Спока.

Я пытался использовать как Jacoco, так и Cobertura для анализа своего проекта. Вот конфигурация, с которой я работаю:

Gradle:       2.2.1
Groovy:       2.3.6
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.8.0_25 (Oracle Corporation 25.25-b02)
OS:           Mac OS X 10.10.1 x86_64

Я использую Gradle-Cobertura-плагин v2.2.5.

Cobertura

В случае Cobertura, заявленный охват линии моего проекта составляет только 35%. Есть большие разделы кода, для которых я написал тесты, которые, как сообщается, не проверены Cobertura:

Покрытие кобертуры

В частности, Cobertura сообщает об отсутствии покрытия для вложенного статического класса. Version.Parser несмотря на наличие полной спецификации Спока, посвященной этому:

Cobertura Version.Parser покрытие

package com.github.tagc.semver

import spock.lang.Specification
import spock.lang.Unroll

import com.github.tagc.semver.Version.Parser

@Unroll
class VersionParserSpec extends Specification {

    private static final Parser PARSER = Version.Parser.getInstance()

    def "Version information should be extracted from files if parsing is not strict"() {
        given:
        def versionFileText = "version='$versionString'"

        expect:
        PARSER.parse(versionFileText, false) == version

        where:
        versionString      | version
        '0.1.2-SNAPSHOT'   | new Version(0,1,2,false)
        '1.2.4'            | new Version(1,2,4,true)
        '1.3-SNAPSHOT'     | new Version(1,3,0,false)
        '0.4'              | new Version(0,4,0,true)
    }

    def "Valid version representation should be parsed successfully"() {
        expect:
        PARSER.parse(input, true) == version

        where:
        input               | version
        '0.1'               | new Version(0,1,0,true)
        '1.3-SNAPSHOT'      | new Version(1,3,0,false)
        '1.1.1'             | new Version(1,1,1,true)
        '0.2.7'             | new Version(0,2,7,true)
        '0.4.9-SNAPSHOT'    | new Version(0,4,9,false)
        '6.3.16-SNAPSHOT'   | new Version(6,3,16,false)
        '  1.2.3-SNAPSHOT'  | new Version(1,2,3,false)
        ' 1.3.5-SNAPSHOT '  | new Version(1,3,5,false)
    }

    def "Invalid version representation (#input) should cause an exception to be thrown"() {
        when:
        PARSER.parse(input, true)

        then:
        thrown(IllegalArgumentException)

        where:
        input << [
            '1.2.a',
            '1,2,3',
            '2.4.-1',
            '3-4-9',
            '1.4.5-SNPSHOT',
            '1.4.5-SNAPSHOTasd'
        ]
    }
}

Ниже приведены соответствующие части моего скрипта сборки Gradle:

buildscript {
    repositories { jcenter() }
    dependencies {
        // Cobertura plugin
        classpath "net.saliman:gradle-cobertura-plugin:2.2.5"
    }
}

configurations.all {
    resolutionStrategy {
        force 'org.ow2.asm:asm:5.0.3'
        forcedModules = [ 'org.ow2.asm:asm:5.0.3' ]
    }
}

apply plugin: 'net.saliman.cobertura'

check.dependsOn 'cobertura'

cobertura {
    coverageFormats = [ 'html', 'xml' ]
}

Jacoco

Для сравнения, Jacoco сообщает о гораздо более вероятном охвате 68% (по инструкции).

Отчет Jacoco

Покрытие того же Version.Parser раздел сообщается как это:

Jacoco Version.Parser report

Соответствующие части моего сценария сборки:

apply plugin: "jacoco"

task integrationTest(type: Test) {
    description = 'Runs the integration tests.'
    group = 'verification'
    testClassesDir = sourceSets.integrationTest.output.classesDir
    classpath = sourceSets.integrationTest.runtimeClasspath

    jacoco {
        destinationFile = file("$buildDir/jacoco/integrationTest.exec")
        classDumpFile = file("$buildDir/classes/integrationTest")
    }
}

jacocoTestReport {
    executionData test, integrationTest

    reports {
        xml.enabled true
        html.enabled true
    }
}

Поскольку Jacoco, кажется, работает нормально, я бы хотел просто придерживаться этого. Тем не менее, кажется, что Sonar не работает должным образом с Jacoco при написании кода на Groovy, поэтому я, похоже, застрял с Cobertura. Есть ли какая-либо причина, по которой Cobertura могла бы предоставить мне эти результаты покрытия?

РЕДАКТИРОВАТЬ

Я поднял это как проблему в хранилище Github плагина Gradle Cobertura.

1 ответ

Я не проверял это сам, но, по-видимому, эта проблема исправлена ​​в v2.2.7 плагина Gradle, который использует v2.1.1 из Cobertura ( источник).

Другие вопросы по тегам