gradle复习(6)-深入Jacoco

最后更新于:2022-04-01 06:52:20

## Jacoco 之前在[构建eclipse项目](http://blog.csdn.net/itfootball/article/details/42710653)中已经涉及了一点,这篇文章详细的讲讲。jacoco是什么,大家google或者百度一下都可以,我就不自己定义了。 需要注意的一点是Jacoco的插件目前还是孵化阶段,以后会有变动。 ## gradle中的Jacoco ## 1.jacoco api 要想在gradle项目中使用jacoco。需要加入下面的plugin语句: ~~~ apply plugin: 'jacoco' ~~~ jacoco在实际上是一个JacocoPluginExtension类型的实例。该类型包括下面的属性和方法: ### 属性 ~~~ reportsDir:报告的存放路径 toolVersion:jacoco的jar包版本,默认为0.7.1.201405082137 ~~~ ### 方法 ~~~ applyTo(tasks):所用于所有的任务 applyTo(task):创建jacoco的插件扩展 ~~~ ## 2.jacoco任务 **在build.gradle脚本文件中加入jacoco任务的语法如下:** ~~~ jacoco{ toolVersion = "0.7.1.201405082137" reportsDir = file("$buildDir/customJacocoReportDir") } ~~~ **jacoco只有上面2个属性可以设置,上面的报告设置的目录为customJacocoReportDir,这个时候我们执行测试任务** ~~~ D:\eclipse\workspare\TestNG_gradl>gradle clean test :clean :compileJava :processResources :classes :compileTestJava :processTestResources :testClasses :test BUILD SUCCESSFUL Total time: 6.443 secs ~~~ **然后再执行jacoco任务:** ~~~ D:\eclipse\workspare\TestNG_gradl>gradle jacoco :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :jacocoTestReport BUILD SUCCESSFUL Total time: 4.883 secs ~~~ **为什么要按照这个顺序呢?因为jacoco是依托测试任务的,测试任务执行完,才能有代码覆盖率的结果。如果你直接执行clean然后执行jacoco,它会跳过jacoco任务。** ~~~ D:\eclipse\workspare\TestNG_gradl>gradle clean jacoco :clean :compileJava :processResources :classes :jacocoTestReport SKIPPED BUILD SUCCESSFUL Total time: 4.246 secs ~~~ **好了,现在我们来看一下结果:** **![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e466c72a78.jpg)** **会发现多了一个customJacocoReportDir文件目录(这可不是我新建的,是自动生成的),打开里面的html文件,就可以看到结果报告的数据啦:** **![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e466c84072.jpg)** **(我的测试case都是简单的输出case,所以覆盖率是0,真实的数据可不是这样的)** ## 3.jacocoTestReport任务 **该任务继承自Report任务,report任务里面分为csv、xml和html格式的测试报告。下面我们来了解了解:** ~~~ jacocoTestReport{ reports{ xml.enabled true csv.enabled true html.enabled true } } ~~~ **上面我们设置了3种格式的报告都存在。然后执行构建任务:** ~~~ D:\eclipse\workspare\TestNG_gradl>gradle clean test jacoco :clean :compileJava :processResources :classes :compileTestJava :processTestResources :testClasses :test :jacocoTestReport BUILD SUCCESSFUL Total time: 8.72 secs ~~~ **结果会生成3种报告,如下图所示:** ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e466c98297.jpg) **下面我们在jacocoTestReport任务中去改变jacoco结果文件的保存目录** build.gradle ~~~ jacocoTestReport{ reports{ xml.enabled true csv.enabled true html.enabled true html.destination "${buildDir}/jacocoHtml" xml.destination "${buildDir}/jacocoXml.xml" csv.destination "${buildDir}/jacocoCsv.csv" } } ~~~ **上面三句设置destination的语句形式是一样的,但是是有区别的。区别在于html的设置是到目录的,其他两个是到文件的。因为html格式的结果页面中操作有很多,而且结果页面也不止一个,所以需要用文件夹保存,必须写到目录。而另外两个就是直接保存到文件的。直接看执行后的结果:** **![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e466ca9b17.jpg)** **由结果可以看出,jacoco任务中设定的目录没有生成,而是生成了jacocoTestReport任务中定义的文件目录。** ## 4.在Test任务中jacoco配置 我们在Test任务中对jacoco进行了扩展,可以对jacoco的一些特殊的属性配置。 ### 1.destinationFile属性 官网解释说是修改已执行的数据要写入的文件。其实就是修改test.exec文件目录或文件名。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e466cbb8b7.jpg) 好,来例子试试。 ~~~ test { useTestNG(); jacoco{ destinationFile = file("$buildDir/doctor/doctorq.exec") } } ~~~ 构建后 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e466ccb897.jpg) ### 2.append append的意思是如果上面的destinationFile 指定的路径存在,那么通过append来配置是否在原有的文件上追加,或者不追加。 如果append = false,那么无论destinationFile文件存不存在,都会生成新文件,意思就是先将之前的删掉,然后生成一个新的。 如果append = true,如果之前的exec文件存在,不会删除它,而是在目录下再生成一个新的。下面看实际操作: **首先我们重新构建一下** ~~~ D:\eclipse\workspare\TestNG_gradl>gradle clean test :clean :compileJava :processResources :classes :compileTestJava :processTestResources :testClasses :test BUILD SUCCESSFUL Total time: 7.645 secs ~~~ **构建后的文件跟上面是一样的,build/doctor/下有一个doctorq.exec文件。build.gradle文件如下:** ~~~ test { useTestNG(); jacoco{ append = true destinationFile = file("$buildDir/doctor/doctorq.exec") } } ~~~ **现在我们将build.gradle文件修改一下,将doctorq.exec的文件名改为doctorq1.exec。** ~~~ test { useTestNG(); jacoco{ append = true destinationFile = file("$buildDir/doctor/doctorq1.exec") } } ~~~ **这个时候我们不能执行clean任务,因为clean会把之前的build文件下全部删除,我们就不好去比较了,那么怎么在不clean的情况还能执行test的任务呢?如果不做任何操作,直接执行test,输出如下:** ~~~ D:\eclipse\workspare\TestNG_gradl>gradle test :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :compileTestJava UP-TO-DATE :processTestResources UP-TO-DATE :testClasses UP-TO-DATE :test UP-TO-DATE BUILD SUCCESSFUL ~~~ **会发现,所有的任务都没有执行,因为没有检测到新的更新,gradle的后台守护程序自然不会再执行,这是gradle优化执行时间的策略。那么这个时候怎么办?** **其实修改一下case的文件就行,我们删除其中一个case文件或者增加一个都行,然后再执行gradle test。这个时候你会发现在build/doctor/目录下多了一个doctorq1.exec文件** **![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-07_568e466cda39a.jpg) ** 但是如果你把build.gradle的append属性设置为false。不管你怎么操作,它都会生成新的,而不是追加。我就不具体贴例子了。
';