【翻译】Gradle Guides - 构建 Java Web 应用程序

原文标题:Building Java Web Applications

原文链接:https://guides.gradle.org/building-java-web-applications/

分类:Gradle Guides

翻译:机器翻译 + 人工调整


目录

一、需求

二、创建 Web 应用程序的框架

三、添加 Gradle build 文件(build.gradle)

四、添加 servlet 和 metadata

五、添加 JSP 页面到 demo 应用

六、添加 gretty 插件、运行 app

七、用 Mockito 对 servlet 执行单元测试

八、添加功能测试【版本不一致】

九、运行功能测试【版本不一致】

十、总结

十一、接下来……


 

Gradle 包含一个用于构建 Java Web 应用程序的 war 插件

社区提供了一个优秀的插件 gretty,用于在 Jetty 或 Tomcat 上测试和部署 Web 应用程序。

本指南演示了如何使用 gretty 插件构建一个简单的 Web 应用程序并将其部署在 Jetty 上。

您还将学习如何使用 Mockito 框架为servlet编写单元测试

以及如何使用 gretty 和 Selenium 为 Web 应用程序编写功能测试

一、需求

  • 大约 21 分钟
  • 文本编辑器或者 IDE
  • JDK
    • 7+,如果使用 Gradle Groovy DSL
    • 8+,如果使用 Gradle Kotlin DSL
  • Gradle,版本 4.10-rc-2 +

二、创建 Web 应用程序的框架

Gradle包含一个war插件,该插件在用户手册的 WAR 插件章节 中有记录。

war插件扩展了Java插件,以增加对Web应用程序的支持。

默认情况下,它使用名为 src/main/webapp 的文件夹存放 Web 相关的资源。

用户手册中的 “Web应用程序快速入门” 部分仍然引用了jetty插件,不赞成使用此处使用的gretty插件。

但是,特定于war插件的部分很好,该部分很快就会更新。

为 webdemo 项目创建以下文件结构:

webdemo/
    src/
        main/
            java/
            webapp/
        test
            java/
  • 任何 servlet 或其他 Java 类都将放在 src / main / java中,
  • 测试将放在 src / test / java 中,
  • 其他 Web 工件将放在 src / main / webapp 中。

三、添加 Gradle build 文件(build.gradle)

将 build.gradle(如果使用Groovy DSL)或build.gradle.kts(如果使用Kotlin DSL)文件添加到项目的根目录:

build.gradle

plugins {
    id 'war'  
}

repositories {
    jcenter()
}

dependencies {
    providedCompile 'javax.servlet:javax.servlet-api:3.1.0' 
    testCompile 'junit:junit:4.12'
}

war 插件添加了 includesCompile 和 providedRuntime 的配置,

类似于常规Java应用程序中的 compile 和 runtime,用于表示本地需要的依赖项,但不应添加到生成的 webdemo.war 文件中。

plugins 语法用于应用 java 和 war 插件。两者都不需要版本,因为它们包含在 Gradle 分发中

通过执行 wrapper 任务为项目生成 Gradle 包装器是一个好习惯:

$ gradle wrapper --gradle-version=4.10-rc-2
:wrapper

这将生成 gradlew 和 gradlew.bat 脚本以及带有wrapper jar 的 gradle 文件夹,如用户手册的 wrapper 部分所述。

四、添加 servlet 和 metadata

五、添加 JSP 页面到 demo 应用

六、添加 gretty 插件、运行 app

gretty插件是一个出色的社区支持插件,可以在 Gradle 插件仓库中找到,网址为https://plugins.gradle.org/plugin/org.akhikhl.gretty。该插件可以在 Jetty 或 Tomcat 上轻松运行或测试 webapps。

通过将以下行添加到 build.gradle 的 plugins 块中,将 gretty 插件添加到我们的项目中。

plugins {
    id 'war'
    id 'org.gretty' version '2.2.0' 
}

gretty 插件向应用程序添加了大量任务,对于在 Jetty 或 Tomcat 环境中运行或测试非常有用。

现在,您可以使用 appRun 任务构建应用程序,并将其部署到默认(Jetty)容器。

$ ./gradlew appRun
:prepareInplaceWebAppFolder
:createInplaceWebAppFolder UP-TO-DATE
:compileJava
:processResources UP-TO-DATE
:classes
:prepareInplaceWebAppClasses
:prepareInplaceWebApp
:appRun
12:25:13 INFO  Jetty 9.2.15.v20160210 started and listening on port 8080
12:25:13 INFO  webdemo runs at:
12:25:13 INFO    http://localhost:8080/webdemo
Press any key to stop the server.
> Building 87% > :appRun

BUILD SUCCESSFUL

您现在可以访问 http//localhost:8080/webdemo 上的 Web 应用程序,然后单击链接以执行GET请求或提交表单以执行POST请求。

虽然输出显示按任意键以停止服务器,但Gradle不会截取标准输入。要停止该过程,请按ctrl-C。

七、用 Mockito 对 servlet 执行单元测试

开源框架 Mockito 可以轻松地对 Java 应用程序进行单元测试。

步骤一:

  1. 将 Mockito 依赖项添加到 testCompile 配置下的构建脚本中。
dependencies {
    providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
    testCompile 'junit:junit:4.12'
    testCompile 'org.mockito:mockito-core:2.7.19'  
}

要对 servlet 进行单元测试,请在src / test / java下创建一个包文件夹org.gradle.demo。

步骤二:

  1. 使用以下内容添加测试类文件HelloServletTest.java:
package org.gradle.demo;

import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.io.StringWriter;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.*;

public class HelloServletTest {
    @Mock private HttpServletRequest request;
    @Mock private HttpServletResponse response;
    @Mock private RequestDispatcher requestDispatcher;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void doGet() throws Exception {
        StringWriter stringWriter = new StringWriter();
        PrintWriter printWriter = new PrintWriter(stringWriter);

        when(response.getWriter()).thenReturn(printWriter);

        new HelloServlet().doGet(request, response);

        assertEquals("Hello, World!", stringWriter.toString());
    }

    @Test
    public void doPostWithoutName() throws Exception {
        when(request.getRequestDispatcher("response.jsp"))
            .thenReturn(requestDispatcher);

        new HelloServlet().doPost(request, response);

        verify(request).setAttribute("user", "World");
        verify(requestDispatcher).forward(request,response);
    }

    @Test
    public void doPostWithName() throws Exception {
        when(request.getParameter("name")).thenReturn("Dolly");
        when(request.getRequestDispatcher("response.jsp"))
            .thenReturn(requestDispatcher);

        new HelloServlet().doPost(request, response);

        verify(request).setAttribute("user", "Dolly");
        verify(requestDispatcher).forward(request,response);
    }
}

该测试为 HttpServletRequest,HttpServletResponse 和 RequestDispatcher类创建模拟对象。

对于doGet测试,创建使用StringWriter的PrintWriter,并将模拟请求对象配置为在调用getWriter方法时返回它。

调用doGet方法后,测试检查返回的字符串是否正确。

对于post请求,模拟请求被配置为返回给定名称(如果存在)或否则返回null,并且getRequestDispatcher方法返回关联的模拟对象。调用doPost方法执行请求。

Mockito 然后验证使用正确的参数在模拟响应上调用setAttribute方法,并在请求调度程序上调用 forward 方法

步骤三:

  1. 您现在可以用 Gradle 的 test 任务(或任何依赖于它的任务,如 build)来测试servlet。
$ ./gradlew build
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:war
:assemble
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
:check
:build

BUILD SUCCESSFUL

可以通过常规方式从build / reports / tests / test / index.html访问测试输出。您应该得到类似于的结果:

test results

八、添加功能测试【版本不一致】

gretty 插件与 Gradle 结合使用,可以轻松地向 Web 应用程序添加功能测试。

步骤一:

  1. 为此,请将以下行添加到构建脚本中:
gretty {
    integrationTestTask = 'test'  
}

// ... rest from before ...

dependencies {
    providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
    testCompile 'junit:junit:4.12'
    testCompile 'org.mockito:mockito-core:2.7.19'
    testCompile 'io.github.bonigarcia:webdrivermanager:1.6.1' 
    testCompile 'org.seleniumhq.selenium:selenium-java:3.3.1' 
}

gretty 插件需要知道哪个任务需要服务器的启动和停止。

通常将其分配给您自己的任务,但为了简单起见,只需使用现有的 test 任务即可。

Selenium 是一种用于编写功能测试的流行开源 API。2.0版基于WebDriver API。

最新版本要求测试人员为他们的浏览器下载并安装 WebDriver 的某一版本,这可能很乏味且难以自动化。

WebDriverManager 项目使 Gradle 可以轻松地为您处理该过程。

步骤二:

  1. 在src / test / java目录中将以下功能测试添加到项目中:
package org.gradle.demo;

import io.github.bonigarcia.wdm.ChromeDriverManager;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import static org.junit.Assert.assertEquals;

public class HelloServletFunctionalTest {
    private WebDriver driver;

    @BeforeClass
    public static void setupClass() {
        ChromeDriverManager.getInstance().setup(); 
    }

    @Before
    public void setUp() {
        driver = new ChromeDriver();               
    }

    @After
    public void tearDown() {
        if (driver != null)
            driver.quit();                         
    }

    @Test
    public void sayHello() throws Exception {      
        driver.get("http://localhost:8080/webdemo");

        driver.findElement(By.id("say-hello-text-input")).sendKeys("Dolly");
        driver.findElement(By.id("say-hello-button")).click();

        assertEquals("Hello Page", driver.getTitle());
        assertEquals("Hello, Dolly!", driver.findElement(By.tagName("h2")).getText());
    }
}

此测试的 WebDriverManager 部分检查二进制文件的最新版本,并在不存在时下载并安装它。

然后,sayHello测试方法将Chrome浏览器驱动到我们应用程序的根目录,填写输入文本字段,单击按钮,并验证目标页面的标题以及h2标记包含预期字符串。

WebDriverManager系统支持Chrome,Opera,Internet Explorer,Microsoft Edge,PhantomJS和Firefox。查看项目文档以获取更多详细信息。

九、运行功能测试【版本不一致】

步骤一:

  1. 使用 test 任务运行测试:
$ ./gradlew test
:prepareInplaceWebAppFolder UP-TO-DATE
:createInplaceWebAppFolder UP-TO-DATE
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:prepareInplaceWebAppClasses UP-TO-DATE
:prepareInplaceWebApp UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:appBeforeIntegrationTest
12:57:56 INFO  Jetty 9.2.15.v20160210 started and listening on port 8080
12:57:56 INFO  webdemo runs at:
12:57:56 INFO    http://localhost:8080/webdemo
:test
:appAfterIntegrationTest
Server stopped.

BUILD SUCCESSFUL

gretty 插件在默认端口上启动Jetty 9的嵌入式版本,执行测试并关闭服务器。

如果你看,你会看到Selenium系统打开一个新的浏览器,访问该网站,填写表格,点击按钮,检查新页面,最后关闭浏览器。【可能因为版本,八、九两步暂未复现】

集成测试通常通过创建单独的 source set 和专用  task 来处理,但这超出了本指南的范围。有关详细信息,请参阅 Gretty文档

十、总结

在本指南中,您学习了:

  1. 使用 Gradle 构建中的 war 插件来定义Web应用程序
  2. 将 servlet 和 JSP 页面添加到 Web 应用程序
  3. 使用 gretty 插件来部署应用程序
  4. 使用 Mockito 框架对 servlet 进行单元测试
  5. 使用 gretty 和 Selenium 对 Web 应用程序进行功能测试

十一、接下来……

Gretty是一个非常强大的API。有关详细信息,请参阅 Gretty文档

有关Selenium的更多详细信息可以在 Selenium网站 上找到,

有关 WebDriverManager 系统的更多信息可以在 WebdriverDriverManager GitHub存储库 中找到。

如果您对功能测试感兴趣,请查看开源 Geb 库,它提供了一个功能强大的Groovy DSL,用于浏览器自动化,它基于Selenium 和 WebDriver。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值