При использовании 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
несмотря на наличие полной спецификации Спока, посвященной этому:
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% (по инструкции).
Покрытие того же Version.Parser
раздел сообщается как это:
Соответствующие части моего сценария сборки:
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 ( источник).