最近研究了一下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程序里就可以直接调用了。