注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

对DWR进行接口测试的一些想法和实践  

来自丰羽   2012-02-21 17:07:28|  分类: 接口测试 |举报 |字号 订阅

  下载LOFTER 我的照片书  |

最近研究了一下dwr的自动测试方案。在这里抛砖一篇博文。

dwr的协议,还是基于HTTP的。客户端一般会使用POST方法来提交内容给服务器端,服务器端从POST内容里面获知客户端想调用服务端的哪个方法,哪些参数。服务端执行这个方法后,把结果响应给客户端。
以下是一段例子:
callCount=1
scriptSessionId=${scriptSessionId}187
c0-scriptName=AlbumBean
c0-methodName=deleteAlbum
c0-id=0
c0-param0=number:250497656
batchId=481523

这里可以很清楚的看到,POST的内容里面指定了要访问的是AlbumBean中的deleteAlbum方法,参数是number类型的250497656。其他什么batchId,scriptSessionId,c0-id, callCount等,大多数情况下都是固定的那几个值。
那我如果要写代码自己来提交这个HTTP请求,就必须把调用的Bean、方法名,还有参数,以及参数类型都按照这个格式进行包装。
如果再进一步,参数类型都是可以通过js的typeof来自动获取。
然后我的思路是:用java写引擎,负责http传输。用js来接受调用,自动获取参数格式,然后把Bean、方法名,还有参数,以及参数类型发给java引擎,把这些内容组织好post出去。
我们再来看看服务端响应的内容:
//#DWR-INSERT
//#DWR-REPLY
var s0={};s0.cDocId=-1;s0.coverStorageType=0;s0.createTime=1329811796415;s0.creatorUserId=9552463;s0.curl="http://d1.bst2.126.net/style/img/m/album/none160.gif";s0.description="\测\试\一\下";s0.id=250514017;s0.name="\测\试\一\下";s0.photoCount=0;s0.privacy=0;s0.resourceId=9552463;s0.status=0;s0.type=0;s0.undeletable=false;s0.updateTime=1329811796415;
dwr.engine._remoteHandleCallback('997381','0',{albumId:250514017,album:s0,code:100});

这段内容可以分三段看:
第一段,是两行申明,一般都固定
第二段,是第三行,是js格式的一段语句,这段语句用js的语法定义了一个js对象
第三段,最后一行,调用了dwr的引擎中的某个方法,参数是json格式的
由于这段内容比较复杂,js格式内容也有,json格式的内容也有,如果想自己写程序获取完整内容,得用些特殊的手段。
我的思路是:这整段返回内容,进行一些简单处理后,直接转化成js的代码,然后用eval来执行这段代码,返回一个js的对象。然后这个js对象转成HashMap,java程序里就可以直接调用了。

整合了以上想法后,我弄了两段程序,一段发信息,一段收信息。
代码不全贴了,只放一些体现思想的代码。
发送post请求:
function getResult(script, method, paras){
var typelist = []
for(var i = 0; i < paras.length; i++){
typelist.push(typeof(paras[i]))
}
var result = "" + engine.getResult(script, method, paras, typelist)
        return result
}
..............
public String getResult(String ScriptName, String MethodName, Object[] args, String[] argsTypes) throws Exception{
String posturl = "http://xxxxxxxxxxxxxxxx/dwr/call/plaincall/" + ScriptName + MethodName +".dwr";
StringBuffer paramBuffer = new StringBuffer();
paramBuffer.append("callCount=1\r\nscriptSessionId=${scriptSessionId}187\r\n");
paramBuffer.append("c0-scriptName=").append(ScriptName).append("\r\nc0-methodName=").append(MethodName);
paramBuffer.append("\r\nc0-id=0");

for(int i=0;i<args.length;i++){
paramBuffer.append("\r\nc0-param").append(i).append("=").append(argsTypes[i]).append(":").append(args[i]);
}
paramBuffer.append("\r\nbatchId=889209\r\n");
return post(posturl, paramBuffer.toString());
}
接收响应内容:注意这里返回的js对象,到java里面,就是sun.org.mozilla.javascript.internal.NativeObject对象,其他简单js类型都有相对应的java对象
public static HashMap<String, Object> getResult(String dwrString) throws Exception{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
HashMap<String, Object> retMap = new HashMap<String, Object>();
engine.put("inputString", dwrString);
engine.put("map", retMap);
String jsScriptString = "" + 
"var re = new RegExp(\"dwr.engine._remoteHandleCallback\\\\('\\\\d+','\\\\d+',(.*?)\\\\);\", \"m\")\n" +
"var value = inputString.replace(re, \"var __result__ = $1\")\n" +
"eval(value)\n" +
"for(var k in __result__) { map.put(k, __result__[k])}";
engine.eval(jsScriptString);
return retMap;
}
public static void justtest(String testString) throws Exception{
HashMap<String, Object> map = getResult(testString);

Double albumId = (Double) map.get("albumId");
System.out.println("albumId : " + albumId.intValue());
NativeObject album = (NativeObject) (map.get("album"));
System.out.println("album.createTime : " + album.get("createTime", null));
System.out.println("album.curl : " + album.get("curl", null));


}

  评论这张
 
阅读(1119)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016