一些開源的測(cè)試框架比如JUnit,TestNG能夠幫助你編寫可復(fù)用的結(jié)構(gòu)化的測(cè)試,為了運(yùn)行這些測(cè)試,你要先編譯它們,就像編譯源代碼一樣。測(cè)試代碼的作用僅僅用于測(cè)試的情況,你可不想把你的測(cè)試代碼發(fā)布到生產(chǎn)環(huán)境中,把源代碼和測(cè)試代碼混在一起可不是個(gè)好主意。通常你會(huì)把源代碼和測(cè)試代碼分開來(lái),比如Gradle的標(biāo)準(zhǔn)項(xiàng)目布局src/main/java和src/test/java。
在前面我們講到默認(rèn)的項(xiàng)目布局,源代碼是src/main/java,資源文件是在src/main/resources,測(cè)試源代碼路徑也是這樣,你把測(cè)試代碼放在src/test/java,資源文件放在src/test/resources,編譯之后測(cè)試的class文件在build/classes/test下。
所有的測(cè)試框架都會(huì)生成至少一個(gè)文件用來(lái)說(shuō)明測(cè)試執(zhí)行的結(jié)果,最普遍的格式就是XML格式,你可以在build/test-results路徑下找到這些文件,XML文件的可讀性比較差,許多測(cè)試框架都允許把測(cè)試結(jié)果轉(zhuǎn)換成報(bào)告,比如JUnit可以生成HTML格式的報(bào)告,Gradle把測(cè)試報(bào)告放在build/reports/test。下圖清晰的顯示了項(xiàng)目的布局:
http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag51.png" alt="" />
上面講了這么多測(cè)試框架,Gradle怎么知道你想使用哪一個(gè)呢?你需要聲明對(duì)外部庫(kù)的依賴。
Java插件引入了兩個(gè)配置來(lái)聲明測(cè)試代碼的編譯期和運(yùn)行期依賴:testCompile和testRuntime,我們來(lái)看一下怎么聲明一個(gè)對(duì)JUnit框架的編譯期依賴:
dependencies {
testCompile 'junit:junit:4.11'
}
另外一個(gè)配置testRuntime用來(lái)聲明那些編譯期用不著但是在運(yùn)行期需要的依賴,記住用于測(cè)試的依賴不會(huì)影響你源代碼的classpath,換句話說(shuō)他們不會(huì)用在編譯或打包過(guò)程。然而,對(duì)于處理依賴來(lái)講測(cè)試配置繼承了源代碼相關(guān)配置,比如testCompile繼承了compile配置的依賴,testRuntime繼承了runtime和testCompile和他們的父類,他們父類的依賴會(huì)自動(dòng)傳遞到testCompile或testRuntime中。如下圖所示:
http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag52.png" alt="" />
在之前的任務(wù)我們可能注意到任務(wù)圖一直有四個(gè)任務(wù)是up-to-date的然后被跳過(guò)了,這是因?yàn)槟銢](méi)有編寫任何測(cè)試代碼Gradle就不需要編譯或執(zhí)行。下圖顯示了這四個(gè)任務(wù)在任務(wù)圖中的位置:
http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag53.png" alt="" />
從圖中可以看到測(cè)試編譯和測(cè)試執(zhí)行階段是在源代碼被編譯和打包之后的,如果你想避免執(zhí)行測(cè)試階段你可以在命令行執(zhí)行g(shù)radle jar或者讓你的任務(wù)依賴jar任務(wù)。
對(duì)于build/classes/test目錄下的所有編譯的測(cè)試類,Gradle怎么知道要執(zhí)行哪一個(gè)呢?答案就是所有匹配下面幾條描述的都會(huì)被檢查:
如果沒(méi)有找到符合條件的,測(cè)試就不會(huì)執(zhí)行,接下來(lái)我們會(huì)使用不同框架來(lái)編寫單元測(cè)試。