Grails插件和依赖项的Cobertura覆盖率
是否有可能为我的Grails应用程序生成一个Cobertura报告,其中不仅包括应用程序代码,还包括我自己编写的几个插件 目前,我(不正确地)在Grails应用程序中为插件编写测试,而不是将这些测试放在相应的插件中 该报告仅包括my Grails应用程序的代码(域类、服务等),其他内容一概不包括。我想覆盖我的应用程序正在使用的大多数插件 我已经尝试通过inplace标记法(grails.plugin.location.fooplugin='path')包含插件,但是覆盖率报告仍然没有包含我的fooplugin代码 帮忙Grails插件和依赖项的Cobertura覆盖率,grails,dependencies,code-coverage,grails-plugin,cobertura,Grails,Dependencies,Code Coverage,Grails Plugin,Cobertura,是否有可能为我的Grails应用程序生成一个Cobertura报告,其中不仅包括应用程序代码,还包括我自己编写的几个插件 目前,我(不正确地)在Grails应用程序中为插件编写测试,而不是将这些测试放在相应的插件中 该报告仅包括my Grails应用程序的代码(域类、服务等),其他内容一概不包括。我想覆盖我的应用程序正在使用的大多数插件 我已经尝试通过inplace标记法(grails.plugin.location.fooplugin='path')包含插件,但是覆盖率报告仍然没有包含我的fo
插件似乎不支持这种行为。我必须下载源代码并为自己创建自定义版本 我已成功检测并报告了我的Grails应用程序的所有直接插件及其可传递插件。 您需要在一些地方修改代码覆盖率的_Events.groovy以使事情正常运行 仪器仪表 修改InstrumentationBuildFileBuilder.build()。它使用MarkupBuilder构建运行Cobertura的AntXML。我添加了下面的“extraClassesDir”:
File extraClassesDir = new File('/path/to/grails/project/target/work/plugin-classes')
...
'target'(name: 'instrument') {
'cobertura-instrument'(instrumentArguments) {
'fileset'(dir: "${classesDir.absolutePath}") {
'include'(name: "**/*.class")
codeCoverageExclusionList.each { pattern ->
'exclude'(name: "${pattern}")
}
}
// My additions:
'fileset'(dir: extraClassesDir.absolutePath) {
'include'(name: "**/*.class")
codeCoverageExclusionList.each { pattern ->
'exclude'(name: "${pattern}")
}
}
}
}
报告
上面的内容将指导您的类,但在报告中,您将无法跳转到源代码。我通过添加以下内容修改了createCoverageReports():
if (buildConfig.coverage?.grailsSourceInclusions) {
buildConfig.coverage.grailsSourceInclusions.each {
fileset(dir: "${it}/grails-app/controllers", erroronmissingdir: false)
fileset(dir: "${it}/grails-app/domain", erroronmissingdir: false)
fileset(dir: "${it}/grails-app/services", erroronmissingdir: false)
fileset(dir: "${it}/grails-app/taglib", erroronmissingdir: false)
fileset(dir: "${it}/grails-app/utils", erroronmissingdir: false)
fileset(dir: "${it}/src/groovy", erroronmissingdir: false)
fileset(dir: "${it}/src/java", erroronmissingdir: false)
}
}
基本上,为了报告,我创建了一个新的配置设置,因此我的Grails项目的BuildConfig.groovy如下所示:
coverage {
enabledByDefault = false
xml = true
grailsSourceInclusions = [
'/path/to/source/of/plugin1',
'/path/to/source/of/plugin2'
]
}
ANT XML
在代码覆盖率的_Events.groovy中,如果注释掉以下行,至少可以查看生成的Ant XML:
println "instrumentBuildFile=$instrumentBuildFile
//instrumentBuildFile.delete()
如果您做得对,那么XML应该在底部附近包含以下内容,以使插装正常工作:
<target name="instrument">
<cobertura-instrument datafile="/path/to/grails/project/cobertura.ser">
<fileset dir="/path/to/grails/project/target/classes">
<include name="**/*.class" />
<exclude name="**/*BootStrap*" />
<exclude name="Config*" />
<exclude name="BuildConfig*" />
...
</fileset>
<!-- Here's our addition -->
<fileset dir="/path/to/grails/project/target/work/plugin-classes">
<include name="**/*.class" />
<exclude name="**/*BootStrap*" />
<exclude name="Config*" />
<exclude name="BuildConfig*" />
...
</fileset>
</cobertura-instrument>
</target>
...
...