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。不管你怎么操作,它都会生成新的,而不是追加。我就不具体贴例子了。