返回介绍

4.3 测试运行中的应用程序

发布于 2025-04-21 21:10:08 字数 1746 浏览 0 评论 0 收藏

说到测试 Web 应用程序,我们还没接触实质内容。在真实的服务器里启动应用程序,用真实的 Web 浏览器访问它,这样比使用模拟的测试引擎更能展现应用程序在用户端的行为。

但是,用真实的 Web 浏览器在真实的服务器上运行测试会很麻烦。虽然构建时的插件能把应用程序部署到 Tomcat 或者 Jetty 里,但它们配置起来多有不便。而且测试这么多,几乎不可能隔离运行,也很难不启动构建工具。

然而 Spring Boot 找到了解决方案。它支持将 Tomcat 或 Jetty 这样的嵌入式 Servlet 容器作为运行中的应用程序的一部分,可以运用相同的机制,在测试过程中用嵌入式 Servlet 容器来启动应用程序。

Spring Boot 的 @WebIntegrationTest 注解就是这么做的。在测试类上添加 @WebIntegrationTest 注解,可以声明你不仅希望 Spring Boot 为测试创建应用程序上下文,还要启动一个嵌入式的 Servlet 容器。一旦应用程序运行在嵌入式容器里,你就可以发起真实的 HTTP 请求,断言结果了。

举例来说,考虑一下代码清单 4-5 里的那段简单的 Web 测试。这里采用 @WebIntegrationTest ,在服务器里启动了应用程序,以 Spring 的 RestTemplate 对应用程序发起 HTTP 请求。

代码清单 4-5 测试运行在服务器里的 Web 应用程序

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(
      classes=ReadingListApplication.class)
@WebIntegrationTest            ←---在服务器里运行测试
public class SimpleWebTest {

  @Test(expected=HttpClientErrorException.class)
  public void pageNotFound() {
    try {
      RestTemplate rest = new RestTemplate();
      rest.getForObject(
           "http://localhost:8080/bogusPage", String.class);   ←---发起 GET 请求
      fail("Should result in HTTP 404");
    } catch (HttpClientErrorException e) {
      assertEquals(HttpStatus.NOT_FOUND, e.getStatusCode());   ←---判断 HTTP 404(not found) 响应
      throw e;
    }
  }

}

虽然这个测试非常简单,但足以演示如何使用 @WebIntegrationTest 在服务器里启动应用程序。要判断实际启动的服务器究竟是哪个,可以遵循在命令行里运行应用程序时的逻辑。默认情况下,会有一个监听 8080 端口的 Tomcat 启动。但是,如果 Classpath 里有的话,Jetty 或者 Undertow 也能启动这些服务器。

测试方法的主体部分假设应用程序已经运行,监听了 8080 端口。它使用了 Spring 的 RestTemplate 对一个不存在的页面发起请求,判断服务器的响应是否为 HTTP 404(NOT FOUND)。如果返回了其他响应,则测试失败。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。