在Gradle中使用Cobertura

本文介绍如何在Gradle项目中集成Cobertura进行代码覆盖率分析,并分享了一个实际项目中遇到的问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gradle虽好,但是默认没有对代码覆盖的支持,还是官网的cook book里面有 一段已经很好用的脚本可以完成这个功能,搞录如下:

usePlugin('java') 

def cobSerFile="${project.buildDir}/cobertura.ser" 
def srcOriginal="${sourceSets.main.classesDir}" 
def srcCopy="${srcOriginal}-copy" 
repositories { 
    mavenCentral() 
} 

dependencies { 
    testRuntime 'net.sourceforge.cobertura:cobertura:1.9.3' 
    testCompile 'junit:junit:4.5' 
} 

test.doFirst { 
    ant { 
        // delete data file for cobertura, otherwise coverage would be added 
        delete(file:cobSerFile, failonerror:false) 

        // delete copy of original classes
        delete(dir: srcCopy, failonerror:false) 

        // import cobertura task, so it is available in the script 
        taskdef(resource:'tasks.properties', classpath: configurations.testRuntime.asPath) 

        // create copy (backup) of original class files 
        copy(todir: srcCopy) { 
            fileset(dir: srcOriginal) 
        } 

        // instrument the relevant classes in-place 
        'cobertura-instrument'(datafile:cobSerFile) { 
            fileset(dir: srcOriginal, includes:"my/classes/**/*.class", excludes:"**/*Test.class") 
        } 
    } 
} 

test { 
    // pass information on cobertura datafile to your testing framework 
    // see information below this code snippet 
} 

test.doLast { 
    if (new File(srcCopy).exists()) { 
        // replace instrumented classes with backup copy again 
        ant { 
            delete(file: srcOriginal) 
            move(file: srcCopy, tofile: srcOriginal) 
        } 

        // create cobertura reports 
        ant.'cobertura-report'(destdir:"${project.buildDirName}/test-results", format:'html', srcdir:"src/main/java", datafile:cobSerFile) 
    } 
}

gradle支持多工程,我把这段代码放到根工程build.gradle里的subprojects配置块中,但是在执行时一个子工程总是在测试时报找不到log4j类的异常。我以为是gradle, ant和cobertura所依赖的log4j的版本不同导致的,但是经过各种尝试,都不能解决问题。后来细读gradle手册,发现了gradle有个project-report插件,可以生成依赖关系图。通过这个图,我才发现那个子项目的testRuntime里面并没有log4j,但是事实上我已经添加了。一番思索后,才想起来,是由于那个子工程build.gradle里的如下脚本导致了问题:

def targetServer = System.properties['targetServer'] configurations {
    ['servlet-api'].each { runtime.exclude module: it }
    if (targetServer == null || targetServer == 'jboss4') {
        ['activation', 'antlr', 'asm', 'asm-attrs', 'cglib', 'commons-codec', 'commons-collections', 'commons-pool', 'dom4j', 'ehcache', 'ejb3-persistence', 'hibernate', 'hibernate-annotations', 'hibernate-commons-annotations', 'hibernate-core', 'hibernate-validator', 'jta', 'log4j', 'mail', 'persistence-api', 'geronimo-jms_1.1_spec', 'geronimo-j2ee-management_1.1_spec'].each {
            runtime.exclude module: it
        }
    }
}

这段脚本是为了在生成war的时候,不包含activation等jar包,因为这个war要部署到jboss服务器上,而jboss上已经包含这些jar包了。不幸的是testRuntime是继承于runtime配置的,从runtime里去掉指定的jar包后,testRuntime里也不再包含那些jar包了,这才会导致cobertura不能运行。解决的有法是使用war插件添加的两个新的配置providedCompile providedRuntime,这两个配置的jar包在编译期和测试期有效,但是却不会被打包到war里面。代码如下: 

dependencies { 
    providedCompile 'javax.xml.bind:jaxb-api:2.2.1' 
    //... 
    providedRuntime 'log4j:log4j:1.2.13' 
    //... 
// }

 

转载于:https://my.oschina.net/komodo/blog/919173

<think>好的,我现在需要回答用户关于如何在IntelliJ IDEA中使用Cobertura插件进行代码覆盖率分析的问题。首先,我需要确认用户的问题是什么。用户提到的是Cobertura插件,但根据提供的引用资料,引用中主要提到的是JaCoCo和IDEA自带的覆盖率工具,而不是Cobertura。所以可能需要先指出这一点,并说明Cobertura可能不被直接支持,但可以提供替代方案。 接下来,我需要检查引用内容。引用[1]和[3]提到IntelliJ IDEA内置的代码覆盖率工具,以及如何配置Coverage runner。引用[2]提到JaCoCo被多种工具集成,包括IDEA。引用[4]和[5]讨论了代码覆盖率的工具和测试覆盖的重要性。但所有引用都没有提到Cobertura在IDEA中的使用,这说明可能需要引导用户使用JaCoCo或者IDEA自带的工具,或者提供可能的替代方法。 可能用户混淆了Cobertura和JaCoCo,或者希望使用Cobertura。但根据现有资料,IDEA可能更支持JaCoCo。因此,在回答中需要说明这一点,并建议使用JaCoCo,同时如果用户确实需要使用Cobertura,可能需要通过其他方式集成,比如Maven或Gradle插件,然后在IDEA中查看报告。 然后,按照用户的要求,回答需要结构清晰,分步骤说明。同时,用户要求生成相关问题,我需要准备三个相关问题。 现在,我需要组织步骤,可能的步骤包括:安装插件(如果有的话),配置构建工具(如Maven),生成覆盖率报告,以及在IDEA中查看结果。但根据引用,IDEA本身可能没有直接支持Cobertura的插件,而更多是JaCoCo。因此,可能需要指导用户使用外部工具生成报告,然后在IDEA中打开。 此外,需要确保使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,但这个问题可能不涉及数学公式,所以可能不需要使用。但需要检查是否有需要的地方,例如如果有提到算法中的数学表达式,但这里主要是配置步骤,可能不涉及。 最后,生成相关问题,例如关于JaCoCo的使用,IDEA内置工具,或者代码覆盖率的优化方法。</think>### IntelliJ IDEA 使用 Cobertura 插件进行代码覆盖分析教程 目前 **IntelliJ IDEA 官方未直接集成 Cobertura 插件**,但可通过以下两种方式实现代码覆盖率分析: --- ### 方法一:使用 IDEA 内置覆盖率工具(推荐) IDEA 自带了覆盖率分析功能,支持 Java、Kotlin 等语言,操作更便捷: 1. **配置覆盖率工具** - 打开 `File > Settings > Build, Execution, Deployment > Coverage`,选择默认的覆盖率工具(如 JaCoCo)[^1][^3]。 - 调整采样率或过滤不需要分析的类。 2. **运行测试并生成报告** - 右键点击测试类或方法,选择 `Run 'Tests' with Coverage`。 - 结果会在 `Coverage` 工具窗口显示,包括行覆盖率、分支覆盖率等[^5]。 3. **导出报告** - 在 `Coverage` 窗口点击 `Export`,生成 HTML 或 XML 格式报告。 --- ### 方法二:通过构建工具集成 Cobertura 若需强制使用 Cobertura,需借助 Maven/Gradle 生成报告后导入 IDEA: 1. **添加 Cobertura 插件到项目** - **Maven** 在 `pom.xml` 中添加: ```xml <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cobertura-maven-plugin</artifactId> <version>2.7</version> </plugin> ``` - **Gradle** 在 `build.gradle` 中添加: ```groovy apply plugin: 'net.saliman.cobertura' ``` 2. **生成覆盖率报告** 执行命令: ```bash mvn cobertura:cobertura # Maven gradle cobertura # Gradle ``` 报告会生成在 `target/site/cobertura`(Maven)或 `build/reports/cobertura`(Gradle)。 3. **在 IDEA 中查看报告** - 使用浏览器打开生成的 `index.html` 文件,或通过 IDEA 的 `Tools > Open Generated Sources` 定位报告。 --- ### 对比建议 - **内置工具(JaCoCo)**:集成度高,实时反馈,适合快速分析[^2]。 - **Cobertura**:需手动配置,适合历史项目或特定兼容性需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值