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

目录
相关文章
|
2月前
|
负载均衡 Java API
Spring Cloud是什么及基本特性都有哪些?
Spring Cloud 是用于构建健壮云应用的框架,包含多个子项目。其核心组件如Eureka(服务注册与发现)、Hystrix(熔断器)、Ribbon(负载均衡)等,帮助开发者快速实现微服务架构。Spring Cloud 提供了服务注册与发现、分布式配置、路由、断路器等功能,简化了微服务开发与管理。本文将重点介绍服务注册与发现及分布式配置两大特性。
115 5
|
5天前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
60 14
|
1月前
|
缓存 NoSQL Java
Redis应用—8.相关的缓存框架
本文介绍了Ehcache和Guava Cache两个缓存框架及其使用方法,以及如何自定义缓存。主要内容包括:Ehcache缓存框架、Guava Cache缓存框架、自定义缓存。总结:Ehcache适合用作本地缓存或与Redis结合使用,Guava Cache则提供了更灵活的缓存管理和更高的并发性能。自定义缓存可以根据具体需求选择不同的数据结构和引用类型来实现特定的缓存策略。
116 16
Redis应用—8.相关的缓存框架
|
2月前
|
前端开发 Java 数据库连接
Spring框架初识
Spring 是一个分层的轻量级开源框架,核心功能包括控制反转(IOC)和面向切面编程(AOP)。主要模块有核心容器、Spring 上下文、AOP、DAO、ORM、Web 模块和 MVC 框架。它通过 IOC 将配置与代码分离,简化开发;AOP 提供了声明性事务管理等增强功能。
98 21
Spring框架初识
|
2月前
|
存储 人工智能 开发框架
Spring AI Alibaba 应用框架挑战赛圆满落幕,恭喜获奖选手
第二届开放原子大赛 Spring AI Alibaba 应用框架挑战赛决赛于 2 月 23 日在北京圆满落幕。
157 10
|
1月前
|
前端开发 Java 数据库连接
Spring MVC 扩展和SSM框架整合
通过以上步骤,我们可以将Spring MVC扩展并整合到SSM框架中。这个过程包括配置Spring MVC和Spring的核心配置文件,创建控制器、服务层和MyBatis的Mapper接口及映射文件。在实际开发中,可以根据具体业务需求进行进一步的扩展和优化,以构建更加灵活和高效的企业级应用程序。
48 5
|
3月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
175 29
|
2月前
|
XML Java 开发者
通过springboot框架创建对象(一)
在Spring Boot中,对象创建依赖于Spring框架的核心特性——控制反转(IoC)和依赖注入(DI)。IoC将对象的创建和管理交由Spring应用上下文负责,开发者只需定义依赖关系。DI通过构造函数、setter方法或字段注入实现依赖对象的传递。Spring Boot的自动配置机制基于类路径和配置文件,自动为应用程序配置Spring容器,简化开发过程。Bean的生命周期包括定义扫描、实例化、依赖注入、初始化和销毁回调,均由Spring容器管理。这些特性提高了开发效率并简化了代码维护。
|
1月前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
|
3月前
|
监控 Java 应用服务中间件
SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析
Spring Boot 通过简化配置、自动配置和嵌入式服务器等特性,大大简化了 Spring 应用的开发过程。它通过提供一系列 `starter` 依赖和开箱即用的默认配置,使开发者能够更专注于业务逻辑而非繁琐的配置。Spring Boot 的自动配置机制和强大的 Actuator 功能进一步提升了开发效率和应用的可维护性。通过对其源码的分析,可以更深入地理解其内部工作机制,从而更好地利用其特性进行开发。
85 6