gradle中使用cobertura做代码覆盖(转)

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.

相关文章:

    1. 在Gradle中使用Cobertura
    2. gradle太好用了

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

时间: 2024-09-12 14:49:18

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

线程类中可以用静态代码块做初始化静态变量么?这些静态变量会不会有并发问题呢?

问题描述 线程类中可以用静态代码块做初始化静态变量么?这些静态变量会不会有并发问题呢? public class SalesConfirmationUploadThread extends Thread { private boolean result = false; private final SalesConfirmationPipedInputStream input; private long orderId; private String pin; private JingdongS

windows-SVN的pre-commit中做代码检测,成功后提交

问题描述 SVN的pre-commit中做代码检测,成功后提交 事情是这样的: 我想实现,在提交代码时,对提交的代码进行编码规范检测,检测通过才能提交成功. 即需要在pre-commit实现检测:检测后面的已经做好. 当前问题是,怎么实现在pre-commit中检测到我的提交代码,并同步更新到我的测试服务器上? 在pre-commit 中只有两个传入参数,路径和事件名,还有一个svnlook命令可以用,感觉自己比较春蠢,不知道怎么做, 求大神拯救,急 急 急 送上全部家当,呜呜,解答. 总结下,

VS 2010 和 .NET 4.0 系列之《在VS 2010中查询和导航代码》篇

本系列文章导航 VS 2010 和 .NET 4.0 系列之<ASP.NET 4 中的SEO改进 >篇 VS 2010 和 .NET 4.0 系列之<干净的Web.Config文件 >篇 VS 2010 和 .NET 4.0 系列之<起始项目模板>篇 VS 2010 和 .NET 4.0 系列之<多定向支持>篇 VS 2010 和 .NET 4.0 系列之<多显示器支持>篇 VS 2010 和 .NET 4.0 系列之<代码优化的Web开发

艾伟_转载:VS 2010 和 .NET 4.0 系列之《在VS 2010中查询和导航代码》篇

本系列文章导航 VS 2010 和 .NET 4.0 系列之<ASP.NET 4 中的SEO改进 >篇 VS 2010 和 .NET 4.0 系列之<干净的Web.Config文件 >篇 VS 2010 和 .NET 4.0 系列之<起始项目模板>篇 VS 2010 和 .NET 4.0 系列之<多定向支持>篇 VS 2010 和 .NET 4.0 系列之<多显示器支持>篇 VS 2010 和 .NET 4.0 系列之<代码优化的Web开发

一起谈.NET技术,VS 2010 和 .NET 4.0 系列之《在VS 2010中查询和导航代码》篇

本系列文章导航 VS 2010 和 .NET 4.0 系列之<ASP.NET 4 中的SEO改进 >篇 VS 2010 和 .NET 4.0 系列之<干净的Web.Config文件 >篇 VS 2010 和 .NET 4.0 系列之<起始项目模板>篇 VS 2010 和 .NET 4.0 系列之<多定向支持>篇 VS 2010 和 .NET 4.0 系列之<多显示器支持>篇 VS 2010 和 .NET 4.0 系列之<代码优化的Web开发

手把手教你如何做代码外置优化

今日爆老师和大家分享的话题是<代码外置优化>.主要介绍代码外置的意义是什么,javascript代码外置优化怎么做,css代码合并怎么做. 首先来了解一下什么是代码外置吧.我们知道用户所看到的网站和搜索引擎蜘蛛看到的是不一样的,用户所看到的是从浏览器经过视觉化后的内容,所以会有文字,图片,动画,登陆等等.但搜索引擎蜘蛛看的是这些内容背后的原始代码(HTML),所以我们希望这些原始代码越是简易对于优化而言越是好,因为代码的简易度直接影响搜索引擎爬取效率,也就是页面是否被蜘蛛所喜爱,所收录. 基于

FLASH中图片的方式代码

最近正好帮人家做一个图片的翻页的FLASH,所以重新研究了一下FLASH中图片的方式代码!以前自己写过一些,不过滚动的效果不是太好,基本的原理就是取起始值与最终值之间的差值,然后除以一个移动系数的方式来写! function mov() {   lx = n*w;   btx = btx+(lx-btx)/6;   this._x = Math.round(0-btx);  }以前写的一段代码!其中LX为最终值    BTX为其实值   6为一个系数   然后没经过一次移位后通过this._x

对ASP.NET MVC项目中的视图做单元测试

关于视图的单元测试 说到ASP.NET MVC,我们似乎始终都在关注对于Controller的测试--虽然Stephen Walther也写过如 何脱离Web Server对View进行单元测试,但是他的方法可看而不可用.复杂的构造和预备,以及对生成的 HTML字符串作判断--这真是在对视图做单元测试吗?仔细分析他的代码可以发现,这其实是在对 ViewEngine做单元测试.而且,如果真要对ViewEngine做单元测试,也不应该像他那样依赖外部文件.在 我看来,他的做法什么都不是--似乎美观,

IBM Rational Application Developer代码覆盖工具入门简介

为您的 Java 程序生成代码覆盖统计数据 简介:代码覆盖率工具是软件测试过程中使用到的一个重要的工具,因为它提供了一个关于程序被测 试用例覆盖程度的观点.本文向您展示了怎样使用 IBM Rational Application Developer 中提供的代码覆盖工具,来为 Java 程序生成测试的覆盖率结果,并提供了关于怎样分析结果以 改进测试的信息. 什么是 Rational Code Coverage 特性? 代码覆盖率是软件测试的一个 重要方面,对于一个构件的总体系统测试来说可能是一个