Java EE,Gradle和集成测试
在過去的幾年中,Apache Maven已成為Java和Java EE項目的事實上的構(gòu)建工具。 但是從兩年前開始, Gradle便獲得了越來越多的用戶。 在我之前的文章( http://www.lordofthejars.com/2015/10/gradle-and-java-ee.html )之后,在這篇文章中,您將看到如何使用Gradle使用Java EE編寫集成測試Arquillian 。
Gradle是類似于Ant或Maven的構(gòu)建自動化工具,但是引入了基于Groovy的DSL語言而不是XML。 因此,您可能希望生成文件是Groovy文件。 您可以閱讀我以前的文章( http://www.lordofthejars.com/2015/10/gradle-and-java-ee.html ),了解如何安裝Gradle 。
為了編寫Java EE的集成測試,事實上的工具是Arquillan。 如果您想了解Arquillian是什么,可以在( http://arquillian.org/guides/getting_started/ )或《 Arquillian In Action》一書中獲得《入門指南》 。
要開始使用Arquillian ,您需要添加Arquillian依賴項,它以BOM的形式出現(xiàn)。 Gradle不支持現(xiàn)成的BOM人工制品,但是您可以使用dependency-management-plugin Gradle插件來支持定義BOM 。
而且Gradle提供了添加除默認源之外的更多測試源集的可能性,在Maven中,默認源集是src / test / java和src / test / resources 。 這個想法是,您可以定義一個新的測試源集,以將所有集成測試放入其中。 通過這種方法,每種測試都可以清楚地分為不同的源集。 您可以在Gradle腳本中編寫Groovy代碼來實現(xiàn)此目的,也可以只使用gradle-testsets-plugin ,這是最簡單的方法。
因此,要注冊這兩個插件(依賴項和測試集),您需要在build.gradle腳本文件中添加下一個元素:
buildscript {repositories {jcenter()}dependencies {classpath "io.spring.gradle:dependency-management-plugin:0.5.3.RELEASE"classpath 'org.unbroken-dome.gradle-plugins:gradle-testsets-plugin:1.2.0'} }apply plugin: "io.spring.dependency-management" apply plugin: 'org.unbroken-dome.test-sets'現(xiàn)在該添加Arquillian依賴項了。 您需要添加Arquillian BOM和兩個依賴關(guān)系,一個依賴關(guān)系設(shè)置我們將Arquillian與JUnit一起使用,另一個依賴關(guān)系將Apache TomEE應(yīng)用程序服務(wù)器設(shè)置為在測試運行期間部署應(yīng)用程序的目標。
用的Arquillian,TomEE和Java EE的依賴可能看起來像的build.gradle:
dependencyManagement {imports {mavenBom 'org.arquillian:arquillian-universe:1.0.0.Alpha1'} }dependencies {testCompile group: 'org.arquillian.universe', name: 'arquillian-junit', ext: 'pom'testCompile group: 'org.apache.openejb', name: 'arquillian-tomee-embedded', version:'1.7.2'testCompile group: 'junit', name: 'junit', version:'4.12'providedCompile group: 'org.apache.openejb',name: 'javaee-api', version:'6.0-6'}最后,您可以通過添加下一部分將新的集成測試文件夾配置為源集:
testSets {integrationTests }其中integrationTest是測試集的名稱。 testSets自動創(chuàng)建并配置下一個元素:
- src / integrationTests / java和src / integrationTests / resources作為有效的源集文件夾。
- 名為integrationTestsCompile依賴關(guān)系配置,其從testCompile延伸,另一種稱為integrationTestRuntime從testRuntime延伸。
- 一個名為integrationTests的Test任務(wù),它將運行集中的測試。
- 一個名為IntegrationTestsJar的Jar任務(wù),用于打包測試。
請注意,您可以將IntegrationTests更改為任何其他值,例如intTests,并且Gradle會將先前的元素自動配置為在testSets中設(shè)置的值(例如src / intTests / java) ,例如,測試任務(wù)將稱為intTests 。
下一步是在IntegrationTests測試集中使用Arquillian創(chuàng)建集成測試。 例如,用于驗證您可以在REST API中發(fā)布顏色并在調(diào)用GET方法時將其返回的Arquillian測試如下所示:
@RunWith(Arquillian.class) public class ColorServiceIntegrationTest {@Deploymentpublic static WebArchive createDeployment() {return ShrinkWrap.create(WebArchive.class).addClasses(ColorService.class);}@ArquillianResourceprivate URL webappUrl;@Test @RunAsClientpublic void postAndGet() throws Exception {// POST{final WebClient webClient = WebClient.create(webappUrl.toURI());final Response response = webClient.path("color/green").post(null);assertThat(response.getStatus(), is(204));}// GET{final WebClient webClient = WebClient.create(webappUrl.toURI());final Response response = webClient.path("color").get();assertThat(response.getStatus(), is(200));final String content = slurp((InputStream) response.getEntity());assertThat(content, is("green"));}}public static String slurp(final InputStream in) throws IOException {final ByteArrayOutputStream out = new ByteArrayOutputStream();final byte[] buffer = new byte[1024];int length;while ((length = in.read(buffer)) != -1) {out.write(buffer, 0, length);}out.flush();return new String(out.toByteArray());}}您現(xiàn)在可以通過簡單地執(zhí)行g(shù)radlew integrationTests來運行集成測試
您會注意到,如果您運行g(shù)radlew build ,那么集成測試任務(wù)將不會運行。 發(fā)生這種情況是因為未在默認的構(gòu)建生命周期內(nèi)注冊任務(wù)。 如果要添加IntegrationTests任務(wù)以在構(gòu)建期間自動執(zhí)行,則需要添加下一行:
check.dependsOn integrationTestintegrationTest.mustRunAfter test確保集成測試在檢查任務(wù)之前運行,并且如果集成測試失敗,則檢查任務(wù)會使構(gòu)建失敗,并確保在集成測試之前運行單元測試。 這樣可以確保即使集成測試失敗也可以運行單元測試。
因此,現(xiàn)在當(dāng)您運行g(shù)radlew build , gradlew build執(zhí)行集成測試。
最后,如果您正在運行JaCoCo插件進行代碼覆蓋會發(fā)生什么? 您將獲得兩個JaCoCo文件,一個用于單元測試執(zhí)行,另一個用于IntegrationTests執(zhí)行。 但是,您可能希望看到兩者的匯總代碼覆蓋率報告都運行在一個文件中,因此您可以在執(zhí)行各種測試后檢查應(yīng)用程序的代碼覆蓋率。 要實現(xiàn)它,您只需要添加下一個任務(wù):
task jacocoRootTestReport(type: JacocoReport) {sourceSets sourceSets.mainexecutionData files(["$buildDir/jacoco/test.exec","$buildDir/jacoco/integrationTests.exec"])reports {xml.enabled falsecsv.enabled false} }在這種情況下,您將創(chuàng)建一個任務(wù),該任務(wù)匯總test.exec文件(來自單元測試)和IntegrationTests.exec的覆蓋范圍結(jié)果(來自集成測試)。
為了生成報告,您需要在運行Gradle時顯式調(diào)用jacocoRootTestReport任務(wù)。
因此,編寫用于運行Java EE測試的Gradle腳本非常簡單,而更重要的是,最終腳本文件看起來非常緊湊且易讀,而無需嚴格遵守任何靜態(tài)約定。
翻譯自: https://www.javacodegeeks.com/2015/11/java-ee-gradle-integration-tests.html
總結(jié)
以上是生活随笔為你收集整理的Java EE,Gradle和集成测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目网上备案流程(项目网上备案)
- 下一篇: ddos攻击会被发现吗(ddos攻击 如