Java EE,Gradle和集成测试

在过去的几年中,Apache Maven已成为JavaJava EE项目的事实上的构建工具。 但是从两年前开始, Gradle便获得了越来越多的用户。 在我之前的文章( http://www.lordofthejars.com/2015/10/gradle-and-java-ee.html )之后,在这篇文章中,您将看到如何使用Gradle使用Java EE编写集成测试Arquillian

Gradle是类似于Ant或Maven的构建自动化工具,但是引入了基于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的形式出现。 Gradle不支持现成的BOM人工制品,但是您可以使用dependency-management-plugin Gradle插件来支持定义BOM

而且Gradle提供了添加除默认源之外的更多测试源集的可能性,在Maven中,默认源集是src / test / javasrc / test / resources 。 这个想法是,您可以定义一个新的测试源集,以将所有集成测试放入其中。 通过这种方法,每种测试都可以清楚地分为不同的源集。 您可以在Gradle脚本中编写Groovy代码来实现此目的,也可以只使用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'

现在该添加Arquillian依赖项了。 您需要添加Arquillian BOM和两个依赖关系,一个依赖关系设置我们将ArquillianJUnit一起使用,另一个依赖关系将Apache TomEE应用程序服务器设置为在测试运行期间部署应用程序的目标。

Arquillian,TomEEJava 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自动创建并配置下一个元素:

  • src / integrationTests / javasrc / integrationTests / resources作为有效的源集文件夹。
  • 名为integrationTestsCompile依赖关系配置,其从testCompile延伸,另一种称为integrationTestRuntimetestRuntime延伸。
  • 一个名为integrationTestsTest任务,它将运行集中的测试。
  • 一个名为IntegrationTestsJarJar任务,用于打包测试。

请注意,您可以将IntegrationTests更改为任何其他值,例如intTests,并且Gradle会将先前的元素自动配置为在testSets中设置的值,例如src / intTests / java ,例如,测试任务将称为intTests

下一步是在IntegrationTests测试集中使用Arquillian创建集成测试。 例如,用于验证您可以在REST API中发布颜色并在调用GET方法时将其返回的Arquillian测试如下所示:

@RunWith(Arquillian.class)
public class ColorServiceIntegrationTest {

    @Deployment
    public static WebArchive createDeployment() {
        return ShrinkWrap.create(WebArchive.class).addClasses(ColorService.class);
    }

    @ArquillianResource
    private URL webappUrl;


    @Test @RunAsClient
    public 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());
    }

}

您现在可以通过简单地执行gradlew integrationTests来运行集成测试

您会注意到,如果您运行gradlew build ,那么集成测试任务将不会运行。 发生这种情况是因为未在默认的构建生命周期内注册任务。 如果要添加IntegrationTests任务以在构建期间自动执行,则需要添加下一行:

check.dependsOn integrationTest

integrationTest.mustRunAfter test

确保集成测试在检查任务之前运行,并且如果集成测试失败,则检查任务会使构建失败,并确保在集成测试之前运行单元测试。 这样可以确保即使集成测试失败也可以运行单元测试。

因此,现在当您运行gradlew buildgradlew build执行集成测试。

最后,如果您正在运行JaCoCo插件进行代码覆盖会发生什么? 您将获得两个JaCoCo文件,一个用于单元测试执行,另一个用于IntegrationTests执行。 但是,您可能希望看到两者的汇总代码覆盖率报告都运行在一个文件中,因此您可以在执行各种测试后检查应用程序的代码覆盖率。 要实现它,您只需要添加下一个任务:

task jacocoRootTestReport(type: JacocoReport) {
    sourceSets sourceSets.main
    executionData files([
            "$buildDir/jacoco/test.exec",
            "$buildDir/jacoco/integrationTests.exec"
    ])
    reports {
        xml.enabled false
        csv.enabled false
    }    
}

在这种情况下,您将创建一个任务,该任务汇总test.exec文件(来自单元测试)和IntegrationTests.exec的覆盖范围结果(来自集成测试)。

为了生成报告,您需要在运行Gradle时显式调用jacocoRootTestReport任务。

因此,编写用于运行Java EE测试的Gradle脚本非常简单,而更重要的是,最终脚本文件看起来非常紧凑且易读,而无需严格遵守任何静态约定。

翻译自: https://www.javacodegeeks.com/2015/11/java-ee-gradle-integration-tests.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值