Spring4.1新特性——Spring缓存框架增强

简介: <p>本文其实不应该算作Spring4.1新特性,该测试框架目前是独立于Spring Framework发展的。<a target="_blank" href="https://github.com/spring-projects/spring-test-htmlunit">Spring MVC Test HtmlUnit</a>提供了<a target="_blank" href="ht

本文其实不应该算作Spring4.1新特性,该测试框架目前是独立于Spring Framework发展的。Spring MVC Test HtmlUnit提供了Spring MVC测试框架HtmlUnit、 WebDriverGeb的集成测试,简化页面自动化测试,利用这些技术可以完成无需启动服务器即可进行页面测试、自动化页面/页面流程测试、Javascript测试、Mock Service提高集成测试速度。本文只会带你使用HtmlUnit和WebDriver进入基本的页面自动化测试一览,不会深入。

 

注:目前不支持JSP页面模板,因为其运行需要web容器支持,请选择如velocity、freemarker等模板引擎。

 

1、定义控制器 

Java代码   收藏代码
  1. @Controller  
  2. public class TestController {  
  3.   
  4.     @RequestMapping("/test1")  
  5.     public String test1(Model model) {  
  6.         return "test1";  
  7.     }  
  8.   
  9.     @RequestMapping("/test2")  
  10.     public String test2(@RequestParam Long id, @RequestParam String name, Model model) {  
  11.         model.addAttribute("id", id);  
  12.         model.addAttribute("name", name);  
  13.         return "test2";  
  14.     }  
  15. }  

2、页面test1.vm

Java代码   收藏代码
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4.     <title></title>  
  5.     <link href="/static/css/style.css" rel="stylesheet" type="text/css">  
  6.     <script type="text/javascript" src="/static/js/jquery-1.11.1.min.js"></script>  
  7. </head>  
  8. <body>  
  9.   
  10. <form id="form" action="/test2" method="post">  
  11.     <label for="id">id:</label>  
  12.     <input type="text" id="id" name="id"/><br/>  
  13.   
  14.     <label for="name">name:</label>  
  15.     <input type="text" id="name" name="name"/><br/>  
  16.   
  17.     <input type="submit" value="submit"/>  
  18. </form>  
  19.   
  20. </body>  
  21. </html>  

输入id和name会跳转到test2页面

 

3、页面test2.vm 

Java代码   收藏代码
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4.     <title></title>  
  5.     <link href="/static/css/style.css" rel="stylesheet" type="text/css">  
  6.     <script type="text/javascript" src="/static/js/jquery-1.11.1.min.js"></script>  
  7. </head>  
  8. <body>  
  9.   
  10. <form id="form" method="post">  
  11.     <label for="id">id:</label>  
  12.     <input type="text" id="id" name="id" value="${id}"/><br/>  
  13.   
  14.     <label for="name">name:</label>  
  15.     <input type="text" id="name" name="id" value="${name}"/><br/>  
  16.   
  17.     <input id="submit-btn" type="submit" value="submit"/>  
  18.   
  19. </form>  
  20.   
  21. <script type="text/javascript">  
  22.     $("#submit-btn").click(function() {  
  23.         $(this).closest("form").attr("action""/submit");  
  24.         $("#id").val("123");  
  25.         $("#name").val("zhangsan");  
  26.         return false;  
  27.     });  
  28. </script>  
  29.   
  30. </body>  
  31. </html>  

在该页面绑定id和name数据,然后点击submit按钮会重新设置id和name数据。

 

4、使用HtmlUnit测试 

4.1、初始化Web环境

Java代码   收藏代码
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration(value = "classpath:spring-mvc.xml")  
  3. @WebAppConfiguration(value = "spring4.1-htmlunit/src/main/webapp")  
  4. public class MockMvcHtmlUnitHelloWorldTest {  
  5.     @Autowired  
  6.     private WebApplicationContext context;  
  7.   
  8.     MockMvc mockMvc;  
  9.     WebClient webClient;  

服务端端配置请参考《Spring MVC测试框架详解——服务端测试》。

 

4.2、创建WebClient

Java代码   收藏代码
  1. @Before  
  2. public void setup() throws Exception {  
  3.     mockMvc = webAppContextSetup(context).build();  
  4.   
  5.     String contextPath = "";  
  6.     webClient = new WebClient();  
  7.     webClient.setWebConnection(new MockMvcWebConnection(mockMvc, contextPath));  
  8. }  

此处需要指定contextPath,如果不指定会把uri路径中的第一个目录作为上下文,如http://localhost/ctx/path,即ctx是上下文,如果不想带上下文需要指定为“”。

 

获取页面1数据,然后设置form表单数据,其操作方式和Javascript DOM类似:

Java代码   收藏代码
  1. HtmlPage page1 = webClient.getPage("http://localhost/test1");  
  2. HtmlForm form1 = page1.getHtmlElementById("form");  
  3. assertEquals("/test2", form1.getAttribute("action"));  
  4.   
  5. page1.getElementById("id").setAttribute("value""1");  
  6. page1.getElementById("name").setAttribute("value""lisi");  

接着提交表单,当前页面会跳转到test2:

Java代码   收藏代码
  1. HtmlPage page2 = form1.getElementsByAttribute("input""type""submit").get(0).click();  
  2. assertEquals("http://localhost/test2", page2.getUrl().toString());  
  3. assertEquals("1", page2.getElementById("id").getAttribute("value"));  
  4. assertEquals("lisi", page2.getElementById("name").getAttribute("value"));  

然后断言该页面的数据是否是上个页面提交过来的。

 

接着点击表单的submit按钮:

Java代码   收藏代码
  1. HtmlForm form2 = page2.getHtmlElementById("form");  
  2. form2.getElementsByAttribute("input""type""submit").get(0).click();  
  3.   
  4. assertEquals("123", page2.getElementById("id").getAttribute("value"));  
  5. assertEquals("zhangsan", page2.getElementById("name").getAttribute("value"));  

点击该按钮后,会重新设置该页面的id和name输入框的数据。

 

整个测试过程还是比较简单的,当然实际页面要比这个复杂很多。

 

5、使用WebDriver进行测试

5.1、初始化Web环境

Java代码   收藏代码
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration(value = "classpath:spring-mvc.xml")  
  3. @WebAppConfiguration(value = "spring4.1-htmlunit/src/main/webapp")  
  4. public class MockMvcWebDriverHelloWorldTest {  
  5.     @Autowired  
  6.     private WebApplicationContext context;  
  7.   
  8.     MockMvc mockMvc;  
  9.     MockMvcHtmlUnitDriver webDriver;  

和使用HtmlUnit类似,就不多介绍了。

 

5.2、创建MockMvcHtmlUnitDriver

Java代码   收藏代码
  1. @Before  
  2. public void setup() throws Exception {  
  3.     mockMvc = webAppContextSetup(context).build();  
  4.     boolean enableJavascript = true;  
  5.     String contextPath = "";  
  6.     webDriver = new MockMvcHtmlUnitDriver(mockMvc, enableJavascript);  
  7.     DirectFieldAccessor accessor = new DirectFieldAccessor(webDriver);  
  8.     BeanWrapper wrapper = new BeanWrapperImpl(accessor.getPropertyValue("webClient"));  
  9.     wrapper.setPropertyValue("webConnection"new MockMvcWebConnection(mockMvc, contextPath));  
  10. }  

此处需要使用反射把WebClient的上下文修改掉,否则必须带着上下文,这是目前它考虑不完善的地方。

 

最后测试完成后,关闭WebDriver

Java代码   收藏代码
  1. @After  
  2. public void tearDown() {  
  3.     webDriver.close();  
  4. }  

 

首先请求test1页面,然后查找相应的元素并输入数据

Java代码   收藏代码
  1. webDriver.get("http://localhost/test1");  
  2. WebElement form1 = webDriver.findElement(By.id("form"));  
  3. webDriver.findElement(By.id("id")).sendKeys("1");  
  4. webDriver.findElement(By.id("name")).sendKeys("lisi");  
  5. form1.findElement(By.cssSelector("input[type=submit]")).click();  

WebDriver支持CSS选择器,在实现负责逻辑时非常有用。

 

提交表单后,跳转到test2页面

Java代码   收藏代码
  1. assertEquals("http://localhost/test2", webDriver.getCurrentUrl());  
  2. assertEquals("1", webDriver.findElementById("id").getAttribute("value"));  
  3. assertEquals("lisi", webDriver.findElementById("name").getAttribute("value"));  

 

接着点击test2页面的submit按钮

Java代码   收藏代码
  1. webDriver.findElementByCssSelector("#form input[type=submit]").click();  
  2.   
  3. assertEquals("/submit", webDriver.findElementById("form").getAttribute("action"));  
  4. assertEquals("123", webDriver.findElementById("id").getAttribute("value"));  
  5. assertEquals("zhangsan", webDriver.findElementById("name").getAttribute("value"));  

   

整个测试过程和HtmlUnit类似,不过API更易用。

 

从目前来看,Spring MVC Test HtmlUnit框架本身只是起到了Spring MVC测试框架和HtmlUnit和WebDriver之间的粘合剂,把它们结合起来,如果没有Spring MVC测试框架的强大,这种融合还是比较麻烦的。


本文转自http://jinnianshilongnian.iteye.com/blog/2108400

目录
相关文章
|
4天前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
22 2
|
8天前
|
安全 Java 开发者
强大!Spring Cloud Gateway新特性及高级开发技巧
在微服务架构日益盛行的今天,网关作为微服务架构中的关键组件,承担着路由、安全、监控、限流等多重职责。Spring Cloud Gateway作为新一代的微服务网关,凭借其基于Spring Framework 5、Project Reactor和Spring Boot 2.0的强大技术栈,正逐步成为业界的主流选择。本文将深入探讨Spring Cloud Gateway的新特性及高级开发技巧,助力开发者更好地掌握这一强大的网关工具。
62 6
|
5天前
|
Cloud Native 安全 Java
Micronaut对决Spring Boot:谁是微服务领域的王者?揭秘两者优劣,选对框架至关重要!
【9月更文挑战第5天】近年来,微服务架构备受关注,Micronaut和Spring Boot成为热门选择。Micronaut由OCI开发,基于注解的依赖注入,内置多种特性,轻量级且启动迅速;Spring Boot则简化了Spring应用开发,拥有丰富的生态支持。选择框架需考虑项目需求、团队经验、性能要求及社区支持等因素。希望本文能帮助您选择合适的微服务框架,助力您的软件开发项目取得成功!
28 2
|
6天前
|
JavaScript 前端开发 Java
【颠覆传统】Spring框架如何用WebSocket技术重塑实时通信格局?揭秘背后的故事与技术细节!
【9月更文挑战第4天】随着Web应用对实时交互需求的增长,传统的HTTP模型已无法满足现代应用的要求,特别是在需要持续、双向通信的场景下。WebSocket协议由此诞生,提供全双工通信渠道,使服务器与客户端能实时互发消息。作为Java开发中最受欢迎的框架之一,Spring通过其WebSocket模块支持这一协议,简化了WebSocket在Spring应用中的集成。
25 0
|
10天前
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
14 0
|
10天前
|
消息中间件 Kafka Java
Spring 框架与 Kafka 联姻,竟引发软件世界的革命风暴!事件驱动架构震撼登场!
【8月更文挑战第31天】《Spring 框架与 Kafka 集成:实现事件驱动架构》介绍如何利用 Spring 框架的强大功能与 Kafka 分布式流平台结合,构建灵活且可扩展的事件驱动系统。通过添加 Spring Kafka 依赖并配置 Kafka 连接信息,可以轻松实现消息的生产和消费。文中详细展示了如何设置 `KafkaTemplate`、`ProducerFactory` 和 `ConsumerFactory`,并通过示例代码说明了生产者发送消息及消费者接收消息的具体实现。这一组合为构建高效可靠的分布式应用程序提供了有力支持。
35 0
|
10天前
|
Java Spring 人工智能
AI 时代浪潮下,Spring 框架异步编程点亮高效开发之路,你还在等什么?
【8月更文挑战第31天】在快节奏的软件开发中,Spring框架通过@Async注解和异步执行器提供了强大的异步编程工具,提升应用性能与用户体验。异步编程如同魔法,使任务在后台执行而不阻塞主线程,保持界面流畅。只需添加@Async注解即可实现方法的异步执行,或通过配置异步执行器来管理线程池,提高系统吞吐量和资源利用率。尽管存在线程安全等问题,但异步编程能显著增强应用的响应性和效率。
23 0
|
10天前
|
测试技术 Java Spring
Spring 框架中的测试之道:揭秘单元测试与集成测试的双重保障,你的应用真的安全了吗?
【8月更文挑战第31天】本文以问答形式深入探讨了Spring框架中的测试策略,包括单元测试与集成测试的有效编写方法,及其对提升代码质量和可靠性的重要性。通过具体示例,展示了如何使用`@MockBean`、`@SpringBootTest`等注解来进行服务和控制器的测试,同时介绍了Spring Boot提供的测试工具,如`@DataJpaTest`,以简化数据库测试流程。合理运用这些测试策略和工具,将助力开发者构建更为稳健的软件系统。
19 0
|
10天前
|
缓存 Java Spring
Spring缓存实践指南:从入门到精通的全方位攻略!
【8月更文挑战第31天】在现代Web应用开发中,性能优化至关重要。Spring框架提供的缓存机制可以帮助开发者轻松实现数据缓存,提升应用响应速度并减少服务器负载。通过简单的配置和注解,如`@Cacheable`、`@CachePut`和`@CacheEvict`,可以将缓存功能无缝集成到Spring应用中。例如,在配置文件中启用缓存支持并通过`@Cacheable`注解标记方法即可实现缓存。此外,合理设计缓存策略也很重要,需考虑数据变动频率及缓存大小等因素。总之,Spring缓存机制为提升应用性能提供了一种简便快捷的方式。
19 0
|
10天前
|
容器 Java Spring
Spring框架遇上Docker:传统与现代的碰撞,谁将重塑应用部署的未来?
【8月更文挑战第31天】Spring框架凭借其强大的企业级特性和便捷的开发模式,在Java开发中占据重要地位。Docker作为容器化技术的代表,提供了轻量级、可移植的应用部署解决方案。两者结合,尤其在微服务架构中,能显著提升开发效率、部署速度和环境一致性。
25 0
下一篇
DDNS