Spring multi-project整合測試Gradle配置筆記

每個Spring Gradle專案通常都會有一個對應的build.gradle來負責建置該專案內容。而要建立一個multi-project的專案,則需要在該專案的根目錄底下加入一個settings.gradle,並在裡面加入各個子專案的名稱:

include "ProjectA", "ProjectB", "ProjectC"

ProjectA、ProjectB、ProjectC各自是獨立的Spring Gradle專案,每一個專案裡面都有各自的build.gradle,每一個都可以獨自運行自己的Gradle Tasks。而在這三個專案的最外層目錄,也就是根目錄底下除了有settings.gradle外,根目錄也會有自己的build.gradle,這個可拿來建置根目錄本身包含其底下所有子專案的gradle也可以一併寫在這邊。例如每個子專案如有相同的plugin或是相依,則可以使用subprojects{…}來做建置。

在multi-project裏時常會有子專案彼此的相依。例如ProjectB、C同時相依ProjectA (ProjectA可能是核心引擎),這時可以在B、C專案build.gradle裏加入:

dependencies {
  compile project(':ProjectA')
}

這時可以發現編譯時A專案會正常被引入。但在測試時想用同樣的方法引入A專案例如:

dependencies { 
  compile project(':ProjectA') 
  testCompile project(':ProjectA') 
}

不清楚compile和testCompile的差別可以先參考之前這篇文章。一般使用gradle的java pluging建置,底下會有main和test兩個sourceSet,main是拿來放主程式,而test是放測試的程式。上面這樣的寫法其實會發現B、C專案其實並沒有正確的吃到A專案的test底下的內容。後來爬文一下,根據這篇文章,重新配置如下:

ProjectA build.gradle

configurations {
    testOutput.extendsFrom (testCompile)
}

task jarTest (type: Jar, dependsOn: testClasses) {
    from sourceSets.test.output
    classifier = 'test'
}

artifacts {
    testOutput jarTest
}

ProjectB|C build.gradle

dependencies {
  compile project(':ProjectA')
  testCompile project(path: ':ProjectA', configuration: 'testOutput')
}

這樣配置後,就可以正常吃到A專案底下的test source set內容。

今天我們會把主測試、單元測試的程式分開再不同的sourceSet底下,避免不必要的程式跟相依函式庫參雜。但預設的gradle java plugin只有main跟test這兩個sourceSet,如果今天想要做整合測試、壓力測試、效能測試等等,當然也是可以寫在同一個testsourceSet底下,但比較好的當然是可以建額外的sourceSet(例如integrationTest)給不同的情況使用。這時我們也是從gradle下手。基本上要執行下面步驟:

  • A source set named “integrationTest”;
  • A dependency configuration named “integrationTestCompile”, which extends from “testCompile”;
  • A dependency configuration named “integrationTestRuntime”, which extends from “testRuntime”;
  • A Test task named “integrationTest” which will run the tests in the set;
  • A Jar task named “integrationTestJar” which will package the tests.

其實要一步一步建立這些配置還是挺冗長的,發現一個比較快速的是可以使用一個叫TestSet的Gradle Plugin,只要簡單的幾行就可以幫忙完成以上的所有的動作,有興趣的可以直接去他們官網參考,這邊就不重複寫了。

這邊也弄一個簡單的multi-project測試專案,有興趣的可以玩玩。

參考:

  • https://github.com/unbroken-dome/gradle-testsets-plugin
  • https://www.testwithspring.com/lesson/running-integration-tests-with-gradle/
  • https://www.petrikainulainen.net/programming/gradle/getting-started-with-gradle-integration-testing-with-the-testsets-plugin/
  • https://www.petrikainulainen.net/programming/gradle/getting-started-with-gradle-integration-testing/#integration-test-requirements
  • https://docs.gradle.org/current/userguide/java_plugin.html
  • https://softnoise.wordpress.com/2014/09/07/gradle-sub-project-test-dependencies-in-multi-project-builds/

 

 

Leave a Reply

當第一個留言者!

avatar
wpDiscuz