4.3 测试运行中的应用程序
说到测试 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)。如果返回了其他响应,则测试失败。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论