gradle很好用,但是默认是没有代码覆盖功能的,只好自己写。曾经在网上找到过别人的一段脚本,虽然也能用,但是有一些不爽的地方,一个原因是它不支持对层级工程中全部代码的覆盖,另一个原因是它用替换build/classes/main里面的class文件,再依赖gradle的单元方式来实现的。我自己写了一个代码覆盖的脚本,可以避免这两个问题,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
allprojects {
    apply plugin:'idea'
}
subprojects {
    apply plugin:'java'
    apply plugin:'eclipse'
    apply plugin:'maven'
    apply plugin:'project-report'
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
    [compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
    dependencies {
        runtime 'org.slf4j:slf4j-log4j12:1.4.2@jar'
        testCompile 'junit:junit:4.8.2'
        testCompile 'org.easymock:easymock:3.0'
        testRuntime module('net.sourceforge.cobertura:cobertura:1.9.4') {
            dependencies "asm:asm:3.1", "oro:oro:2.0.8", "asm:asm-tree:3.0"
        }
        testRuntime 'log4j:log4j:1.2.13'
        testRuntime('org.apache.ant:ant-junit:1.8.2'){transitive = false}
    }
    /* START 代码覆盖 */
    task runCover(dependsOn: testClasses) << {
        def codeCoverDir = new File(buildDir, "codeCover")
        def codeCoverClassesDir = new File(codeCoverDir, "classes")
        def codeCoverTestReportDir = new File(codeCoverDir, "testReport")
        def codeCoverDataFile = new File(codeCoverDir, "cobertura.ser")
        def originalClassesDir = new File(buildDir, "classes/main")
        def unitTestClassesDir = new File(buildDir, "classes/test")
        def projectPath = project.path
        ant {
            delete(dir: codeCoverDir, failonerror:false)
            mkdir(dir: codeCoverDir)
            mkdir(dir: codeCoverClassesDir)
            mkdir(dir: codeCoverTestReportDir)
            if (!unitTestClassesDir.exists()) {
                mkdir(dir: unitTestClassesDir)
            }
            taskdef(resource:'tasks.properties', classpath: configurations.testRuntime.asPath)
            taskdef(name: 'junit', classname: 'org.apache.tools.ant.taskdefs.optional.junit.JUnitTask',
                    classpath: configurations.testRuntime.asPath)
            copy(todir: codeCoverClassesDir) {
                fileset(dir: originalClassesDir)
            }
            logger.lifecycle("cobertura-instrument: ${projectPath}")
            'cobertura-instrument'(datafile:codeCoverDataFile) {
                fileset(dir: codeCoverClassesDir, includes:"**/*.class")
            }
            logger.lifecycle("junit: ${projectPath}")
            junit(haltonfailure: true, showoutput: true, fork: true, forkmode:'once') {
                sysproperty(key: "net.sourceforge.cobertura.datafile", value: codeCoverDataFile)
                classpath {
                    pathelement(path: configurations.testRuntime.asPath)
                    pathelement(location: codeCoverClassesDir)
                    pathelement(location: unitTestClassesDir)
                }
                formatter(type: 'plain')
                batchtest(todir: codeCoverTestReportDir) {
                    fileset(dir: unitTestClassesDir, includes: "**/*Test.class")
                }
            }
        }
    }
    task reportCover(dependsOn: runCover) << {
        def codeCoverDir = new File(buildDir, "codeCover")
        def codeCoverReportDir = new File(codeCoverDir, "coverReport")
        def codeCoverDataFile = new File(codeCoverDir, "cobertura.ser")
        ant {
            mkdir(dir: codeCoverReportDir)
            taskdef(resource:'tasks.properties', classpath: configurations.testRuntime.asPath)
            'cobertura-report'(destdir: codeCoverReportDir, format:'html', datafile:codeCoverDataFile, encoding:'utf8') {
                fileset(dir: "${projectDir}/src/main/java", includes: "**/*.java")
            }
        }
    }
    /* END */
}
/**
 * 在根目录的build/codeCover/coverReport目录里生成整个工程的代码覆盖报告。必须至少有一个子工程存在,才能正常执行
 */
task reportCoverAll(dependsOn: subprojects.collect{"${it.path}:runCover"}) << {
    def codeCoverDir = new File(buildDir, "codeCover")
    def codeCoverReportDir = new File(codeCoverDir, "coverReport")
    def codeCoverDataFile = new File(codeCoverDir, "cobertura.ser")
    ant {
        mkdir(dir: codeCoverReportDir)
        taskdef(resource:'tasks.properties', classpath: subprojects.toArray()[0].configurations.testRuntime.asPath)
        'cobertura-merge'(datafile: codeCoverDataFile) {
            fileset(dir: rootDir, includes: "*/build/codeCover/cobertura.ser")
        }
        'cobertura-report'(destdir: codeCoverReportDir, format:'html', datafile:codeCoverDataFile, encoding:'utf8') {
            subprojects.each {
                fileset(dir: "${it.projectDir}/src/main/java", includes: "**/*.java")
            }
        }
    }
}

实现的思路就是在每个子工程的build目录下生成codeCover目录,然后把testClasses生成的被测试的代码通过cobertura加工到这个目录下的子目录,再调用junit测试,最后生成报告,与gradle java插件里面的test任务没有任何关系。根工程里面的reportCoverAll可以把各子工程生成的cobertura.ser文件合并,生成统一的报告。

This work, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

http://sulong.me/2011/08/03/use_cobertura_in_gradle_in_a_better_way

gradle中使用cobertura做代码覆盖(转)的更多相关文章

  1. 完美解决--用VS中的Git做代码管理器,与他人共享代码

    1.创建代码仓库,这里说一下为什么要创建仓库,Git不能够作为源代码管理器,vs中自带的也只能够在本地进行管理,要和他们共享的话必须要有服务器端去存储代码,类似于SVN,它就有客户端和服务器端,这里推 ...

  2. [资源]--完美解决--用VS中的Git做代码管理器,与他人共享代码

    1.创建代码仓库,这里说一下为什么要创建仓库,Git不能够作为源代码管理器,vs中自带的也只能够在本地进行管理,要和他们共享的话必须要有服务器端去存储代码,类似于SVN,它就有客户端和服务器端,这里推 ...

  3. 测者的测试技术手册:自动化单元工具EvoSuie的代码覆盖报告

    EvoSuite是由Sheffield等大学联合开发的一种开源工具,用于自动生成测试用例集,生成的测试用例均符合Junit的标准,可直接在Junit中运行.得到了Google和Yourkit的支持. ...

  4. java代码覆盖实战

    Jacoco原理 代码插桩 On-the-fly插桩: JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过Class Loader装载 ...

  5. Gradle中的buildScript代码块

    在编写Gradle脚本的时候,在build.gradle文件中经常看到这样的代码: build.gradle 1 2 3 4 5 6 7 8 9 buildScript { repositories ...

  6. [转] Gradle中的buildScript代码块

    PS: 在build script中的task apply plugin: 'spring-boot' 需要 classpath("org.springframework.boot:spri ...

  7. VS中代码覆盖问题

    在VS中编写代码时,需要插入代码是,经常是将插入点后面的代码覆盖掉而不是将它向后推. 解决这样的问题,只需要按   Insert 键即可, 我的笔记本是   Fn 加 del

  8. 测者的测试技术手册:自动的自动化框架EvoSuite集成Cobertura得到可视化的代码覆盖报告

    EvoSuite是由Sheffield等大学联合开发的一种开源工具,用于自动生成测试用例集,生成的测试用例均符合Junit的标准,可直接在Junit中运行.得到了Google和Yourkit的支持. ...

  9. C/C++代码覆盖工具gcov与lcov入门

    C/C++代码覆盖工具gcov与lcov入门 gcov是一个可用于C/C++的代码覆盖工具,是gcc的内建工具.下面介绍一下如何利用gcov来收集代码覆盖信息.想要用gcov收集代码覆盖信息,需要在g ...

随机推荐

  1. log4net和一般的记录日志方法

    下载 http://files.cnblogs.com/crazyair/log4net.zip 1 在web项目中新建一个 Log4Net.config <?xml version=" ...

  2. SharePoint发展 - 使用Session(代码更改webconfig)

    博客地址 http://blog.csdn.net/foxdave SharePoint启用Session能够使用Powershell,戳这里:能够改动webconfig. 本篇叙述的重点是通过fea ...

  3. 广域网佰腾玩O2O笑话——它看起来很漂亮,注定不低于

    据说 2014.8.29:中国最大的商业运营商万达在一起的互联网服务供应商百度.腾讯在深圳(属性)战略合作签约仪式举行. 从功能表面上.万达代表实体,百度代表数据.腾讯代表社区:按三个合伙人理解,是要 ...

  4. Oracle 基于 RMAN 的不完全恢复(incomplete recovery by RMAN)

    Oracle 数据库可以实现数据库不完全恢复与完全恢复.完全恢复是将数据库恢复到最新时刻,也就是无损恢复,保证数据库无丢失的恢复.而不完全恢复则是根据需要特意将数据库恢复到某个过去的特定时间点或特定的 ...

  5. Mybatis数据操作

    Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作   详细的Spring MVC框架搭配在这个连接中: Maven 工程下 Spring MVC 站点配置 (一) M ...

  6. mysqldump: Couldn't execute 'show events': Cannot proceed because system tables used by Event Schedu

    最近将老版本的mysql 实例倒入 percona 5.5.30,使用的是线上的全备,结果将mysql 库下的表也倒入了,这下可悲剧了,备份报错. 没办法,将mysql库下的数据倒出来,清空,再倒入p ...

  7. 读取 raspberrypi 的cpu和gpu温度

    #!/usr/bin/env python # -*- coding: utf-8 -*- import requests import json import time import command ...

  8. 【原创】leetCodeOj --- Find Peak Element 解题报告

    题目地址: https://oj.leetcode.com/problems/find-peak-element/ 题目内容: A peak element is an element that is ...

  9. 找呀志_java网络编程(5)TCP和udp差额

    1.TCP定向链接,尽管该网络的不稳定性质,所述不安全确定多少次握手不能保证连接的可靠性.但TCP的三次握手至少(事实上确保了相当大的程度)以确保连接的可靠性; 和UDP不面向连接的,UDP前传送的数 ...

  10. CentOS 6.3 安装 samba 共享(转)

    PHP环境在linux下,但是开发的时候用的是windows,于是我用了samba将linux的一个目录共享,然后在windows上做映射,这样就可以直接在windows下编辑linux上的文件了 首 ...