`
jinnianshilongnian
  • 浏览: 21550570 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2426765
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3015716
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5645446
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:261412
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1599892
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:251021
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5867499
Group-logo
跟我学Nginx+Lua开...
浏览量:704194
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:789104
社区版块
存档分类
最新评论

请您先登录,才能继续操作

Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介

阅读更多

目录

Spring4.1新特性——综述

Spring4.1新特性——Spring核心部分及其他

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

Spring4.1新特性——异步调用和事件机制的异常处理

Spring4.1新特性——数据库集成测试脚本初始化

Spring4.1新特性——Spring MVC增强

Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介

Spring4.1新特性——静态资源处理增强

 

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

 

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

 

1、定义控制器 

@Controller
public class TestController {

    @RequestMapping("/test1")
    public String test1(Model model) {
        return "test1";
    }

    @RequestMapping("/test2")
    public String test2(@RequestParam Long id, @RequestParam String name, Model model) {
        model.addAttribute("id", id);
        model.addAttribute("name", name);
        return "test2";
    }
}

2、页面test1.vm

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <link href="/static/css/style.css" rel="stylesheet" type="text/css">
    <script type="text/javascript" src="/static/js/jquery-1.11.1.min.js"></script>
</head>
<body>

<form id="form" action="/test2" method="post">
    <label for="id">id:</label>
    <input type="text" id="id" name="id"/><br/>

    <label for="name">name:</label>
    <input type="text" id="name" name="name"/><br/>

    <input type="submit" value="submit"/>
</form>

</body>
</html>

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

 

3、页面test2.vm 

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <link href="/static/css/style.css" rel="stylesheet" type="text/css">
    <script type="text/javascript" src="/static/js/jquery-1.11.1.min.js"></script>
</head>
<body>

<form id="form" method="post">
    <label for="id">id:</label>
    <input type="text" id="id" name="id" value="${id}"/><br/>

    <label for="name">name:</label>
    <input type="text" id="name" name="id" value="${name}"/><br/>

    <input id="submit-btn" type="submit" value="submit"/>

</form>

<script type="text/javascript">
    $("#submit-btn").click(function() {
        $(this).closest("form").attr("action", "/submit");
        $("#id").val("123");
        $("#name").val("zhangsan");
        return false;
    });
</script>

</body>
</html>

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

 

4、使用HtmlUnit测试 

4.1、初始化Web环境

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = "classpath:spring-mvc.xml")
@WebAppConfiguration(value = "spring4.1-htmlunit/src/main/webapp")
public class MockMvcHtmlUnitHelloWorldTest {
    @Autowired
    private WebApplicationContext context;

    MockMvc mockMvc;
    WebClient webClient;

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

 

4.2、创建WebClient

    @Before
    public void setup() throws Exception {
        mockMvc = webAppContextSetup(context).build();

        String contextPath = "";
        webClient = new WebClient();
        webClient.setWebConnection(new MockMvcWebConnection(mockMvc, contextPath));
    }

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

 

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

        HtmlPage page1 = webClient.getPage("http://localhost/test1");
        HtmlForm form1 = page1.getHtmlElementById("form");
        assertEquals("/test2", form1.getAttribute("action"));

        page1.getElementById("id").setAttribute("value", "1");
        page1.getElementById("name").setAttribute("value", "lisi");

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

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

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

 

接着点击表单的submit按钮:

        HtmlForm form2 = page2.getHtmlElementById("form");
        form2.getElementsByAttribute("input", "type", "submit").get(0).click();

        assertEquals("123", page2.getElementById("id").getAttribute("value"));
        assertEquals("zhangsan", page2.getElementById("name").getAttribute("value"));

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

 

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

 

5、使用WebDriver进行测试

5.1、初始化Web环境

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = "classpath:spring-mvc.xml")
@WebAppConfiguration(value = "spring4.1-htmlunit/src/main/webapp")
public class MockMvcWebDriverHelloWorldTest {
    @Autowired
    private WebApplicationContext context;

    MockMvc mockMvc;
    MockMvcHtmlUnitDriver webDriver;

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

 

5.2、创建MockMvcHtmlUnitDriver

    @Before
    public void setup() throws Exception {
        mockMvc = webAppContextSetup(context).build();
        boolean enableJavascript = true;
        String contextPath = "";
        webDriver = new MockMvcHtmlUnitDriver(mockMvc, enableJavascript);
        DirectFieldAccessor accessor = new DirectFieldAccessor(webDriver);
        BeanWrapper wrapper = new BeanWrapperImpl(accessor.getPropertyValue("webClient"));
        wrapper.setPropertyValue("webConnection", new MockMvcWebConnection(mockMvc, contextPath));
    }

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

 

最后测试完成后,关闭WebDriver

    @After
    public void tearDown() {
        webDriver.close();
    }

 

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

        webDriver.get("http://localhost/test1");
        WebElement form1 = webDriver.findElement(By.id("form"));
        webDriver.findElement(By.id("id")).sendKeys("1");
        webDriver.findElement(By.id("name")).sendKeys("lisi");
        form1.findElement(By.cssSelector("input[type=submit]")).click();

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

 

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

        assertEquals("http://localhost/test2", webDriver.getCurrentUrl());
        assertEquals("1", webDriver.findElementById("id").getAttribute("value"));
        assertEquals("lisi", webDriver.findElementById("name").getAttribute("value"));

 

接着点击test2页面的submit按钮

        webDriver.findElementByCssSelector("#form input[type=submit]").click();

        assertEquals("/submit", webDriver.findElementById("form").getAttribute("action"));
        assertEquals("123", webDriver.findElementById("id").getAttribute("value"));
        assertEquals("zhangsan", webDriver.findElementById("name").getAttribute("value"));

   

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

 

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

 

相关文章

http://htmlunit.sourceforge.net/

https://code.google.com/p/selenium/wiki/HtmlUnitDriver(需 翻 墙)

https://github.com/spring-projects/spring-test-htmlunit/blob/master/src/asciidoc/index.adoc

Spring MVC测试框架详解——服务端测试

Spring MVC测试框架详解——客户端测试

 

Spring4新特性

Spring4新特性——泛型限定式依赖注入

Spring4新特性——核心容器的其他改进

Spring4新特性——Web开发的增强

Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC 

Spring4新特性——Groovy Bean定义DSL

Spring4新特性——更好的Java泛型操作API 

Spring4新特性——JSR310日期API的支持

Spring4新特性——注解、脚本、任务、MVC等其

 

源码下载

https://github.com/zhangkaitao/spring4-1-showcase/tree/master/spring4.1-htmlunit

 

4
0
分享到:
评论
8 楼 h348592532 2015-01-17  
这个必须顶,还有开涛老师的分享精神
7 楼 jinnianshilongnian 2014-09-27  
zhch152 写道
import com.github.zhangkaitao.pb.UserProtos;

这个类也找不到。。。。从github上下载下来的代码

通过pb插件自动生成的
6 楼 zhch152 2014-09-27  
import com.github.zhangkaitao.pb.UserProtos;

这个类也找不到。。。。从github上下载下来的代码
5 楼 zhch152 2014-09-26  
spring-test-mvc-htmlunit

这些包都下载不下来?[img][/img]
4 楼 jinnianshilongnian 2014-08-25  
ping2010 写道
我们一般知道Controller这层。

恩 大多数是
3 楼 ping2010 2014-08-25  
我们一般知道Controller这层。
2 楼 jinnianshilongnian 2014-08-25  
tianice 写道
实际项目中有这么搞的吗?这工作量可不小

目前想在合适的场景试一把。
1 楼 tianice 2014-08-25  
实际项目中有这么搞的吗?这工作量可不小

相关推荐

    spring4-1-showcase:Spring4.1新特性

    我的公众号:kaitao-1234567 我的新书: 一书总结并梳理了亿级流量网站高可用和高并发原则,通过实例详细介绍了如何落地这些原则。...页面自动化测试框架Spring MVC Test HtmlUnit简介 静态资源处理增强

    基于Andorid的电子杂志应用系统设计.zip

    基于Andorid的电子杂志应用系统设计实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。

    《网络传播技术与实务》第10章-握在手中的网络——移动通信与无线网络技术.ppt

    《网络传播技术与实务》第10章-握在手中的网络——移动通信与无线网络技术.ppt

    基于COMSOL的电磁传感器用于螺孔缺陷检测的建模与仿真

    内容概要:本文详细介绍了如何利用COMSOL Multiphysics进行螺孔缺陷检测的电磁传感器建模与仿真。首先,通过参数化建模创建带有螺纹孔的金属块,并在螺纹根部引入微小V型槽作为缺陷。接着,设置了材料属性,特别是针对缺陷区域的非线性磁导率变化进行了细致调整。然后,配置了物理场环境,包括激活AC/DC模块的电流和磁场接口,设定合适的边界条件和激励电流频率范围。网格划分采用了自适应策略,确保缺陷区域的高分辨率。求解器设置为频域稳态求解,并通过后处理展示了缺陷处的电磁场分布特性,如电场强度突变和涡流密度矢量图。此外,还讨论了实际应用中的注意事项和技术细节,如表面粗糙度的影响、频率选择以及结果验证方法。 适合人群:从事无损检测、电磁仿真研究的技术人员,以及有一定COMSOL使用经验的研发人员。 使用场景及目标:适用于工业生产中对螺孔内部微小裂纹的精确检测,旨在提高产品质量和安全性,防止因隐蔽缺陷导致的重大事故发生。 其他说明:文中提供了大量具体的MATLAB和COMSOL命令代码片段,帮助读者快速复现实验步骤并深入理解每个环节的设计意图。同时强调了实际操作中的常见陷阱及其应对措施,使读者能够更好地掌握这一复杂技术的应用要点。

    【ABB机器人】-IRB1600机器人维护信息.pdf

    【ABB机器人】-IRB1600机器人维护信息.pdf

    《计算机网络基础》第2章-数据通信.ppt

    《计算机网络基础》第2章-数据通信.ppt

    rubyinstaller-devkit-3.4.3-1-x64

    ruby-3.4.3-windows-x64安装包

    声子晶体中声表面波的光学特性及其应用研究

    内容概要:本文详细探讨了声子晶体中声表面波的光学特性。声子晶体作为一种人工复合材料,能够对弹性波(即声子)进行独特调控。文中介绍了声子晶体的基础原理,包括其周期性结构产生的带隙效应,以及声表面波与其相互作用时发生的折射、反射等光学类比现象。此外,还讨论了声子晶体在传感器、通信等领域的潜在应用,特别是在构建声表面波滤波器方面的重要意义。文章通过具体的Python和MATLAB代码展示了如何模拟声子晶体的结构和声表面波的传播特性,并解释了带隙形成的物理机制。同时,强调了几何对称性和材料参数对声波调控的影响,提出了优化仿真的方法和技术。 适合人群:从事材料科学、物理学及相关领域的研究人员,尤其是对声子晶体和声表面波感兴趣的学者和技术人员。 使用场景及目标:适用于希望深入了解声子晶体声表面波光学特性的科研工作者,旨在帮助他们掌握相关理论知识和数值模拟技能,从而应用于新型声学器件的设计和开发。 其他说明:文章提供了多个实例和代码片段,便于读者理解和实践。同时,指出了实验中常见的挑战和解决方案,如材料损耗建模、缺陷引入等,有助于提高仿真的准确性。

    机械工程电梯柔性提升系统横向-纵向耦合动力学建模与仿真:基于Galerkin法的振动控制分析及工程应用(含详细代码及解释)

    内容概要:本文详细介绍了电梯柔性提升系统横向-纵向耦合动力学建模与仿真的全过程。首先,基于能量法和Hamilton原理,建立了考虑平衡绳影响的横向-纵向耦合振动控制方程,并使用Galerkin法将其离散化为常微分方程。随后,通过Python代码实现并仿真了高速电梯参数下的振动响应,分析了平衡绳和导轨不平顺对系统振动的具体影响。研究结果显示,平衡绳能有效抑制横向振动(上行降低20%,下行降低5%),但对纵向振动有一定影响;而导轨不平顺会导致横向振动突变,对纵向振动影响较小。最终,通过数值仿真验证了论文中的主要结论,为电梯振动控制提供了理论依据和工程建议。 适合人群:具备一定力学和编程基础,对机械振动、电梯工程感兴趣的科研人员和工程师。 使用场景及目标:①理解电梯柔性提升系统的振动特性及其影响因素;②掌握基于能量法和Hamilton原理建立复杂系统动力学模型的方法;③学习如何使用Galerkin法离散化偏微分方程并进行数值仿真;④为电梯系统的设计优化提供参考,特别是平衡绳和导轨安装精度的控制。 其他说明:本文不仅提供了理论分析,还通过详细的Python代码展示了完整的仿真流程,便于读者动手实践。研究结果强调了平衡绳和导轨不平顺对电梯振动的重要影响,提出了具体的设计建议,如安装平衡绳以抑制横向振动、严格控制导轨安装精度等。此外,文中还验证了钢丝绳的安全系数,确保仿真条件符合工程实际。

    《网络规划与设计教程》第二章:网络互联技术概述.ppt

    《网络规划与设计教程》第二章:网络互联技术概述

    电力电子领域单相Boost PFC电路的双闭环控制仿真模型及其实现方法

    内容概要:本文详细介绍了单相Boost功率因数校正(PFC)电路及其双闭环控制仿真模型的设计与实现。首先阐述了单相PFC电路的基础概念,解释了Boost电路的工作原理,即通过控制开关管的导通与关断来提升输入电压并实现功率因数校正。接着讨论了在网侧220V/50Hz条件下,如何利用电压外环电流内环双闭环控制系统确保输出电压稳定性和高功率因数。文中还提供了基于Python和MATLAB/Simulink的具体代码示例,展示了如何模拟Boost电路的行为以及构建双闭环控制策略。此外,针对可能出现的问题如启动时电压超调、电流波形畸变等提出了相应的解决方案和技术细节。 适合人群:从事电力电子系统设计的研究人员、工程师和技术爱好者,尤其是那些希望深入了解PFC技术和掌握相关仿真技能的人群。 使用场景及目标:适用于需要优化电力电子设备性能的应用场合,例如工业自动化、家用电器等领域。通过学习本文的内容,读者可以更好地理解和应用单相Boost PFC电路及其双闭环控制机制,从而提高产品的效率和可靠性。 其他说明:文中不仅包含了理论性的介绍,还有大量的实战经验和技巧分享,帮助读者更快地掌握这一复杂的技术领域。同时强调了在实际工程实践中应注意的关键点,如参数选择、波形调试等方面的知识。

    黑马程序员ThreeJS 3D车展效果展示(含素材源码)

    源文件

    《计算机程序设计(C语言)》第7章-第6节-变量的存储类别.ppt

    《计算机程序设计(C语言)》第7章-第6节-变量的存储类别.ppt

    《计算机程序设计(C语言)》第4章-第2节-if语句.ppt

    《计算机程序设计(C语言)》第4章-第2节-if语句.ppt

    FPGA领域Verilog实现串口通信:兼容Xilinx与Altera的收发模块设计与应用

    内容概要:本文详细介绍了基于FPGA的串口通信模块的设计与实现,涵盖波特率生成、发送模块的状态机设计以及接收模块的抗干扰措施。特别针对Xilinx和Altera两种主流FPGA平台进行了优化,确保代码可以在不同平台上无缝运行。文中不仅提供了完整的Verilog代码片段,还分享了许多实用的调试技巧,如波特率分频系数的精确计算、采样点的选择、跨平台复位信号的处理等。此外,作者还强调了硬件连接和约束文件配置的重要性,为初学者提供了一套完整的解决方案。 适合人群:对FPGA有一定了解,希望深入掌握串口通信机制的工程师和技术爱好者。 使用场景及目标:适用于需要在FPGA平台上实现可靠串口通信的应用场合,如嵌入式系统开发、工业自动化控制等领域。通过本教程的学习,读者能够独立完成串口通信模块的设计与调试,掌握关键技术和常见问题的解决方法。 其他说明:文章附带了经过验证的实际案例和代码,便于读者进行实践操作。同时提醒开发者注意电压匹配等问题,以防止硬件损坏。

    基于FX3U PLC与RS485通信板的多品牌变频器控制方案详解

    内容概要:本文详细介绍了使用FX3U PLC配合FX3U-485BD通信板对西门子V20、台达VFD-M和三菱E700三种变频器进行通信控制的方法。涵盖了硬件配置、接线方法、参数设置、程序编写等方面的内容。文中不仅提供了具体的接线步骤,还针对不同品牌的变频器给出了详细的参数配置指导,并附有简单的梯形图程序示例,帮助读者理解和实施变频器的精确控制。此外,文章还分享了一些实用的经验技巧,如解决通信不稳定等问题的方法。 适合人群:从事工业自动化领域的工程师和技术人员,特别是那些需要集成多个品牌变频器控制系统的人群。 使用场景及目标:适用于需要通过PLC对多种品牌变频器进行集中控制的应用场合,如工厂生产线、自动化设备等。主要目标是提高系统的灵活性和可靠性,减少维护成本,提升生产效率。 其他说明:文中提供的信息和案例有助于读者快速掌握PLC与变频器之间的通信控制技术,同时也强调了实际操作过程中需要注意的一些细节问题,如接线规范、参数匹配等。

    《组态软件控制技术》第7章--报表系统.ppt

    《组态软件控制技术》第7章--报表系统.ppt

    《网页制作基础教程(Dreamweaver-CS6版)》第6章-CSS与行为.pptx

    《网页制作基础教程(Dreamweaver-CS6版)》第6章-CSS与行为.pptx

    weixin286基于SSM框架的童装购买平台微信小程序+ssm(文档+源码)_kaic

    weixin286基于SSM框架的童装购买平台微信小程序+ssm(文档+源码)_kaic

    《计算机财务管理》01-02-资金时间价值.ppt

    《计算机财务管理》01-02-资金时间价值.ppt

Global site tag (gtag.js) - Google Analytics