gradle复习(6)-深入Jacoco

本博客全部为原创,转载请注明出处:D.Q的专栏(http://blog.csdn.net/itfootball)。
如有疑惑,请到TesterHome(http://testerhome.com/)论坛交流。


Jacoco


之前在构建eclipse项目中已经涉及了一点,这篇文章详细的讲讲。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

好了,现在我们来看一下结果:


gradle复习(6)-深入Jacoco_第1张图片


会发现多了一个customJacocoReportDir文件目录(这可不是我新建的,是自动生成的),打开里面的html文件,就可以看到结果报告的数据啦:


gradle复习(6)-深入Jacoco_第2张图片


(我的测试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种报告,如下图所示:


gradle复习(6)-深入Jacoco_第3张图片


下面我们在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格式的结果页面中操作有很多,而且结果页面也不止一个,所以需要用文件夹保存,必须写到目录。而另外两个就是直接保存到文件的。直接看执行后的结果:


gradle复习(6)-深入Jacoco_第4张图片


由结果可以看出,jacoco任务中设定的目录没有生成,而是生成了jacocoTestReport任务中定义的文件目录。



4.在Test任务中jacoco配置


我们在Test任务中对jacoco进行了扩展,可以对jacoco的一些特殊的属性配置。


1.destinationFile属性


官网解释说是修改已执行的数据要写入的文件。其实就是修改test.exec文件目录或文件名。


gradle复习(6)-深入Jacoco_第5张图片


好,来例子试试。


test {
	useTestNG();
	jacoco{
		destinationFile = file("$buildDir/doctor/doctorq.exec")
	}
}

构建后


gradle复习(6)-深入Jacoco_第6张图片


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文件


gradle复习(6)-深入Jacoco_第7张图片


但是如果你把build.gradle的append属性设置为false。不管你怎么操作,它都会生成新的,而不是追加。我就不具体贴例子了。


你可能感兴趣的:(gradle)