如何简单模拟Web服务

news/2024/7/5 6:07:00

在SOA环境中,系统不可避免地要与其他系统进行交互,可以是基于SOAP的Web服务,基于RESTful Web服务,基于消息队列,甚至是基于RPC远程调用。随着系统依赖的增长,对单个系统进行测试也变得越来越困难,如何有效地隔离各个系统,对系统进行单独的测试呢?

 

本文会给大家介绍一个简单的测试方法——基于Mock进行测试

 

开发过程中常用的测试有单元测试与集成测试,下面也分成两部分来做说明。

 

当然,你可以选择自己实现一些用于模拟Web服务的类,但本文中的方法选择尽量不要为Mock做过多的开发,因此更多地会选择一些辅助工具来帮助测试。

 

一、单元测试中的Mock

 

单元测试本身就要求将被测试类与它的依赖隔离开来,仅测试被测类本身的逻辑,此时可以选择一些Mock工具对接口进行模拟。是否进行了合理的设计也会影响单元测试的编写,例如,应该遵循“面向接口编程 ”的最佳实践。

 

Java中常用的Mock框架包括:

  • jMock(http://www.jmock.org/ )
  • EasyMock(http://www.easymock.org/ )
  • mockito(http://mockito.org/ )

可以根据个人喜好选择一个合适的框架。本文以jMock为例,进行说明。Web服务的接口定义如下:

项目代码Operator类中引用了该服务,需要取得返回值进行后续操作。

 

在编写单元测试时,为SampleService模拟一个对象注入Operator。关于jMock的使用,请参考jMock的《Getting Started 》或者《Cheat Sheet 》。jMock主要是使用录制-回放 的方式,通过预先设定期望的输入与输出实现Mock。

 

单元测试中直接通过编码的途径用jMock模拟了外部系统的逻辑,业务代码并不关注究竟是调用了真是的Web服务,还是Mock对象。同样的,对于DAO等依赖也可以使用同样的方式进行模拟。

 

二、集成测试中的Mock

 

集成测试时同样可以通过编程的方式实现Mock,比如在Spring上下文中加载Mock的Bean而非通过XFire(或其他Web服务框架)引 入的客户端。但这种做法未免过于繁琐,而且在希望改变Mock类返回结果时,可能需要修改代码重新编译发布。更有甚者,上线时如果忘记从测试的配置换回生 产配置,就会出大问题。

 

当然,你可以选择部署一台真实的服务提供方,但有时出于种种原因,这并不是一个很好的选择。

 

相信在测试Web服务时,不少人都是用过soapUI ,但仅限于使用soapUI调用Web服务,其实强大的soapUI还可以Mock服务,根据事先的配置(Groovy脚本、XPath匹配、顺序、随机 等方法)返回不同的结果。其实现原理简单地说就是根据给定的WSDL模拟Web服务,接受请求后根据配置解析请求,随后返回预先设定的结果,这里的请求和 响应都是标准的SOAP报文。

 

简单实现步骤如下:

  1. 创建一个新的soapUI项目,在“New soapUI Project”对话框中输入WSDL地址,随后选中“Create MockService”。
  2. 在“Generate MockService”对话框中选中要模拟的操作,Path和Port尽量和真实的目标服务器保持一致。例如,发布WSDL的路径可能是 http://xxx:8080/services/sampleService?wsdl,那么Path就是/services /cardInfoService,Port为8080。
  3. 编辑应答SOAP报文及返回逻辑。

在MockService的各个方法上点右键可以进入MockOperation Editor或者直接创建新的MockResponse。MockService创建时,每个操作都会有个Response,没有设定规则时,这就是默认应答。

 

可以仅使用一个Response,多次调用需要不同结果时手工修改,但这样一点都不“自动化”,可以通过soapUI的分派机制自动根据规则返回对应结果。

 

soapUI支持的分派机制(详见MockOperations and Responses )有:

  • SCRIPT,使用Groovy脚本。
  • SEQUENCE,按照MockResponse添加的顺序逐个返回。
  • QUERY-MATCH,基于请求内容选择合适的结果返回。可以指定XPath路径及该节点的期望值,如果匹配的话返回对应Response。
  • XPATH,与QUERY-MATCH类似,XPath节点的值就是要返回的MockResponse的名字。
  • RAMDOM,随机返回。

个人认为XPATH和QUERY-MATCH这两种分派机制在复杂情况下比较好用,如果再复杂,可以考虑SCRIPT。以XPATH为例,假设请求报文如下:

可以设置两个MockResponse,名字分别为“hi”和“hello”,在编辑器中选择“XPATH” ,设置如下XPATH:

当//fac:in0的值是“hi”时就会返回名为“hi”的MockResponse。“hi”MockResponse内容:

如果使用QUERY_MATCH,除了填写XPath,还要再填写“Expacted Value”,比如“hi”或者“hello”,然后“Dispatch to”中选择合适的MockResponse。

 

在项目中只需要把Web服务的Endpoint地址做成可配置的,就可以方便地调整测试与生产环境的Endpoint,实现Mock与真实服务器的切换。

 

使用Mock可以大大降低测试的成本,工欲善其事必先利其器,选择一个合适的Mock工具,可以帮助你更好的进行测试。So,行动吧~

 

 

 

 

 

 

 

 

 


http://www.niftyadmin.cn/n/3367206.html

相关文章

spring mvc redirect 重定向 跳转并传递参数

在项目中做form表单功能提交时,防止用户客户端后退或者刷新时重复提交问题,需要在服务端进行重定向跳转,具体跳转方式有以下几种方式: 公用代码: Java代码 RequestMapping(value“/index”,method { RequestMethod.POST, Reques…

游戏行业术语一览(2)--游戏运营转化率[转载]

转化率这个指标在各行各业的数据分析中运用的非常之广泛,例如:电商中就会存在,点击到订单生成的一系列转化率,传统的销售行业也会在做广告的时候考虑该广告能够转化多少订单,而在游戏行业,转化率同样是一个…

记mysql中时间相关的一个奇怪问题

发现mysql中类型为时间的字段,在查询时显示的时间是什么是依赖于客户端的,不同的客户端查同一个时间,可能在客户端显示的时间是不一样的。至于这个在哪里配置,以及服务端如何依据这个配置为客户端返回结果,这个还没深入…

如何整合JIRA、FishEye、Crucible进行CodeReview

Atlassian的东西相信大家都不陌生,知道Confluence的有木有,用过JIRA的有木有,虽然说这些产品都要收费,不过对于学校和开源组织都可以申请免费License,也可以申请试用。 前段时间为了方便做CodeReview,尝试了…

列表,循环

二维列表 list1 [[1,2,3], [1,2,3], [1,2,3],] print(lsit[1][1]) 列表方法 1、append()  在列表末尾添加新的元素 2、extend()  在末尾一次性追加另一个列表中的多个值 3、insert()  下标处添加一个元素,不覆盖原数据,原数据向后顺延 4、pop() …

script webshell jspWebShell / pythonWebShell / phpWebShell

google shell http://www.jiunile.com/google-shell.html http://goosh.org用命令行来玩google , 输入ls可以看目录内容. shell爱好者们可以来玩下 http://simplejee.group.iteye.com/group/wiki/2105-simplejee simplejee是一个开源的面向j2ee初学者的小项目。该项目里提供…

Tomcat访问日志分析

常使用web服务器的朋友大都了解,一般的web server有两部分日志: 一是运行中的日志,它主要记录运行的一些信息,尤其是一些异常错误日志信息 二是访问日志信息,它记录的访问的时间,IP,访问的…

RESTful Web Services Cookbook中文版译者序

从去年开始我一直在翻译ORelly的《RESTful Web Services Cookbook 》,翻译的过程有些纠结,导致整本书的进度比预期的要慢很多,但一切原因都不能影响翻译的质量,我依然坚持这样一个原则。再过一段时间这本书就能与读者见面了&#…