Grails插件和依赖项的Cobertura覆盖率

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应用程序生成一个Cobertura报告,其中不仅包括应用程序代码,还包括我自己编写的几个插件

目前,我(不正确地)在Grails应用程序中为插件编写测试,而不是将这些测试放在相应的插件中

该报告仅包括my Grails应用程序的代码(域类、服务等),其他内容一概不包括。我想覆盖我的应用程序正在使用的大多数插件

我已经尝试通过inplace标记法(grails.plugin.location.fooplugin='path')包含插件,但是覆盖率报告仍然没有包含我的fooplugin代码

帮忙


插件似乎不支持这种行为。我必须下载源代码并为自己创建自定义版本

我已成功检测并报告了我的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>

...
...