## 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
~~~
**好了,現在我們來看一下結果:**
****
**會發現多了一個customJacocoReportDir文件目錄(這可不是我新建的,是自動生成的),打開里面的html文件,就可以看到結果報告的數據啦:**
****
**(我的測試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種報告,如下圖所示:**

**下面我們在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格式的結果頁面中操作有很多,而且結果頁面也不止一個,所以需要用文件夾保存,必須寫到目錄。而另外兩個就是直接保存到文件的。直接看執行后的結果:**
****
**由結果可以看出,jacoco任務中設定的目錄沒有生成,而是生成了jacocoTestReport任務中定義的文件目錄。**
## 4.在Test任務中jacoco配置
我們在Test任務中對jacoco進行了擴展,可以對jacoco的一些特殊的屬性配置。
### 1.destinationFile屬性
官網解釋說是修改已執行的數據要寫入的文件。其實就是修改test.exec文件目錄或文件名。

好,來例子試試。
~~~
test {
useTestNG();
jacoco{
destinationFile = file("$buildDir/doctor/doctorq.exec")
}
}
~~~
構建后

### 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文件**
**
**
但是如果你把build.gradle的append屬性設置為false。不管你怎么操作,它都會生成新的,而不是追加。我就不具體貼例子了。
- 前言
- gradle學習(1)-helloworld
- gradle學習(2)-基礎語法
- gradle學習(3)-基礎認識
- gradle學習(4)-構建java項目
- gradle學習(5)-創建eclipse項目
- gradle學習(6)-依賴管理
- gradle學習(7)-groovy
- gradle學習(8)-gradle的命令行
- gradle學習(9)-獲取build相關信息
- gradle學習(10)-gui
- gradle學習(11)-編寫構建腳本
- gradle學習(12)-groovy一些基礎語法
- gradle學習(13)-有的沒的
- gradle學習(14)-任務
- gradle學習(15)-任務
- gradle學習(16)-操作文件
- gradle學習(17)-被合并的ant
- gradle學習(18)-ant的屬性
- gradle學習(19)-log系統
- gradle學習(20)-詳解java插件
- gradle學習(21)-在eclipse中構建java項目
- gradle復習(1)-2種定義任務方式的區別
- gradle復習(2)-eclipse中添加依賴jar包
- gradle復習(3)-在gradle項目中使用TestNG
- gradle復習(4)-Cannot find System Java Compiler
- gradle復習(5)-Test remote debug
- gradle復習(6)-深入Jacoco
- gradle復習(7)-深入Jacoco
- gradle復習(8)-Task中行為
- gradle學習(22)-Sonar
- gradle學習(23)-Sonar runner