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