gradle exclude_Gradle学习记录020 java工程的测试 part1
詳細學習如何用Gradle測試java工程。第二部分。該學習記錄基于Gradle官方網站資料。本篇參考鏈接如下:
https://docs.gradle.org/current/userguide/java_testing.html
基礎
Gradle中所有的測試都圍繞這Test類型。它可以使用多種測試用類庫比如junit,TestNG。
并且可以自動校對結果。將校對結果通過TestReport類型的任務輸出。
Test類型的任務需要知道一下兩方面的信息:
- 測試代碼的編譯結果在什么地方保存(property: Test.getTestClassesDirs())
- 測試運行時需要參照的classpath(property: Test.getClasspath())
java插件引入了
- 名字為test的source set指定測試代碼所在文件夾
- 名字為test的Test類型任務來執行測試
- 名字為testImplementation和testRuntimeOnly的配置來指定依賴
利用以上任務及配置之后,我們只需要對test任務進行一些設定就可以執行測試。如下:
dependencies { testImplementation 'junit:junit:4.12'}test { // 告訴test任務,測試使用的使junit引擎 useJUnit() // 將堆的大小的最大值設定為1G maxHeapSize = '1G'}關于如何設定test任務,后面會詳細學習。如果需要自定義測試任務,可以參照上一章。
測試的執行
Gradle使用另外的JVM分支執行測試,獨立于執行構建腳本的主分。這樣可以避免classpath的沖突。
既然是獨立的JVM分支,那么可以設定自己的參數,而不會對主分支產生影響。下面是一些測試任務的設定
※官網給出的設定示例很不使用。所以筆者使用了Test類型的Javadoc中的例子
// 引入java插件,可以直接使用test任務apply plugin: 'java' // test任務用于執行測試test { // 告訴Gradle使用TestNG進行測試,不指定會默認junit4 useTestNG() // 告訴Gradle使用junitPlatform進行測試。就是junit5 useJUnitPlatform() // 設置系統參數 systemProperty 'some.prop', 'value' // 包含某些文件夾下的測試 include 'org/foo/**' // 除外某些文件夾下的測試 exclude 'org/boo/**' // 在控制臺輸出測試的標準結果或者錯誤 testLogging.showStandardStreams = true // 為JVM設定堆的大小 minHeapSize = "128m" maxHeapSize = "512m" // 給JVM傳遞參數 jvmArgs '-XX:MaxPermSize=256m' // 使用測試的聲明周期方法,beforeTest在所有測試的執行前都會執行 beforeTest { descriptor -> logger.lifecycle("Running test: " + descriptor) } // 測試出現錯誤則中斷所有測試 failFast = true // 監聽標準輸出和錯誤 onOutput { descriptor, event -> logger.lifecycle("Test: " + descriptor + " produced standard out/err: " + event.message ) }}更多的設定可參照如下鏈接
https://docs.gradle.org/current/dsl/org.gradle.api.tasks.testing.Test.html
測試的過濾
Gradle提供了兩種方法來過濾測試
- 過濾器(推薦)
- 使用inlusion/exclusion
使用過濾器可以通過如下條件來過濾測試
- 使用測試類的全名,或者測試方法的全名
- 一個簡單的以大寫字母開頭的類名
- 星號(*)
下面的示例簡單展示了過濾器的使用
test { filter { // 包括所有方法名以UiCheck結尾的方法 includeTestsMatching "*UiCheck" // 包括所有指定包下的測試類 includeTestsMatching "org.gradle.internal.*" }}關于過濾器的參數,可以參照
https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/testing/TestFilter.html
使用--tests參數可以指定執行特定的測試比如
# 執行所有SomeTestClass中的測試方法
gradle test --tests SomeTestClass
# 執行特定的測試方法
gradle test --tests SomeTestClass.someSpecificMethod
# 執行SomeTestClass類中名字內含有someMethod的測試方法
gradle test --tests SomeTestClass.*someMethod*
測試結果報告
Test類型的任務可以生成html,xml,和原生二進制文件。一般情況下使用html較多。測試結果報告默認放在build文件夾下。
當然也可以明確指定為其他文件夾
// 指定結果報告保存目錄reporting.baseDir = "my-reports"// 指定測試結果保存目錄testResultsDirName = "$buildDir/my-test-results"task showDirs { doLast { logger.quiet(rootDir.toPath().relativize(project.reportsDir.toPath()).toString()) logger.quiet(rootDir.toPath().relativize(project.testResultsDir.toPath()).toString()) }}輸出:
$ gradle showDirsStarting a Gradle Daemon (subsequent builds will be faster)> Task :showDirsmy-reportsbuildmy-test-resultsBUILD SUCCESSFUL in 13s1 actionable task: 1 executedJava插件還引入了testReport任務,用來自定義html的格式等需求。subprojects { apply plugin: 'java' // 讓test任務的輸出結果報告功能失效 test { reports.html.enabled = false }}task testReport(type: TestReport) { // 指定報告存放目錄 destinationDir = file("$buildDir/reports/allTests") // 包含所有子工程的test任務生成的報告 reportOn subprojects*.test}查找需要執行的測試類
Gradle默認自動查找需要執行的測試類
如果使用Junit4進行測試,Gradle會按照如下規則查找測試類
- 類繼承自TestCase或者GroovyTestCase
- 有@Runwith注解
- 其或其父類包含具有@Test注解的方法
需要注意的是,Gradle會去查找繼承樹,父類在jar包內的時候,這個jar包如果包含測試類也會被執行。
如果不希望Gradle自動查找,可以將scanForTestClasses設定為false,這時只能通過includes和excluds方式。
但是使用Junit platform的時候,scanForTestClasses是不起作用的。 Gradle默認不去自動查找測試類,需要手動通過include和excludes指定。
一個完整的利用Gradle和junit進行測試的示例
目錄構成
測試代碼類示例
示例中的test2會拋出異常使測試非正常結束
package myjava.effective;import java.util.Optional;import org.junit.Test;public class Java8_7_Optional_Test { @Test public void test1() { // parameter can not be null Optional op = Optional.of(new Person()); Person person = op.get(); System.out.println(person); } @Test public void test2() { // construct an empty instance Optional op = Optional.empty(); System.out.println(op.get()); } @Test public void test3() { // if null then revoke empty, else revoke of Optional op = Optional.ofNullable(null); if (op.isPresent()) { System.out.println(op.get()); } // if exist then use it else create a new one Person person = op.orElse(new Person("AAAA總結
以上是生活随笔為你收集整理的gradle exclude_Gradle学习记录020 java工程的测试 part1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python和java二选一该学啥_Py
- 下一篇: 开源版本_开源版本PowerShell