对于 jsp +servlet mvc框架的程序应该怎么测试 (2)
http://expert.csdn.net/expert/topic/1977/1977071.xml?temp=.7061884
推荐阅读
如果是单元测试,
我说说我以前的一种做法,
首先我们构建一个简单的框架:
jsp做显示,
一个servlet做事件派发器,
一个接口,暂时命名为handler,
对于客户的请求,根据请求名称我们获得当前请求的必要信息,
假如有这些:请求处理类名,请求的转向页面。
扩展handler接口的处理类执行具体的处理操作。
请求的处理类对请求进行处理,并把处理结果置入request,jsp页面获得处理结果
并展示它。
我使用的是httpunit,
首先是对servlet进行测试,这个很容易,
生成普通的测试类可以搞定,当然,这里可能还要添加一个handler的扩展用以测试,
对这个类,因为只有一个,而且功能确定,问题不大。
接着是对功能的添加,每当需要添加新的处理功能时,我们扩展handler来实现,
并且进行必要的配置,使我们的serlvet可以响应这个新功能的请求,
要对handler的扩展进行测试,我们还要做些准备,首先是将测试完成的servlet
拿出来,重新做一些必要的改动,如果有必要的话,比如,这个类将不再是httpservlet的
子类,这样做很有必要,然后我们可以重新构造一下其中的方法,比如将原来的一些抛出的异常改掉,还有,如果愿意的话可以改改方法的名字以适应它的新角色。
然后,我们包装一下我们的testcase,让所有要对handler扩展类进行的测试
都继承它,这么做的目的是简化具体类测试的过程,
因为测试过程中我们关注的是输入和输出,所以把配置输入和检验输出的部分抽象,
这里我们可以这么做,继承testcase,然后添加一个两个抽象方法,分别用于实现配置输入
和检验输出,由子类来完成,接着我们来重构一些testcase的方法,
这里我们只做一些简单的处理,
首先,由于我们对输入和检验输出都做了抽象,要求子类来实现,以对目标类的一次测试,
所以我们重栽runbare()方法,让它只调用我们的一个方法进行测试,
这个方法是我们要实现的,很简单,我们实例化一个已经准备好的用于测试的servlet,
把准备好的request和response以及servlet config作为输入调用servelt的方法,
比方说,如果实际doget和dopost都调用的同一个方法doing,那么,我们就调用
doing()吧,执行完后,就要验证输出了。
在这里,简要说下环境配置,
我们可以实现一下setup()方法,先调用我们的配置参数方法获得一个map,它给定了
参数名以及参数值,这里的参数是模拟的页面传递给服务器的参数序列,
然后我们要获得一个servelt的环境,通过httpunit很容易做到:
sr = new servletrunner("web.xml");
sc = sr.newclient();
request = new postmethodwebrequest( action );
使用获得的参数map来配置request,
这样可以获得一个模拟的request,实际上基本和实际差不多了,
获得一个测试环境,
ic = sc.newinvocation( request );
通过它我们获得我们要真正用于测试的:
servlet = ic.getservlet();
realreq = ic.getrequest();
realres = ic.getresponse();
servlet.getservletconfig()获得我们的servletconfig,
三个参数具备了,
执行完成之后,我们对request进行验证,因为处理结果在request中,
这个由子类来完成。
好了,所有都准备好了之后,就可以对扩展handler的处理类进行测试了,
我们扩展一个准备好的testcase,实现参数配置,
在结果验证方法中我们验证request中的结果集是否正确。
httpunit的细节就不说了,
希望有更多人讨论。
因为好久没有做这种测试了,所以说起来不是很流畅,
见谅。给出的几句代码恐怕要了解下httpunit的。
最后还有一个就是页面的测试,
我很少做这方面工作,所以就不说了,
而在我们这个简单的框架中,如果控制的好的话,jsp承担的角色很简单,
如果要测试,那么仍然是使用httpunit可以完成,
另外有一个jwebunit,我以前简单得用过,
做页面得测试应该也是胜任得,而且有个朋友说过,他用它来测试,想来是不错得,
我之所以没有用它,是因为只知道可以进行web页面得测试,条件是要开服务得,
而我希望的是静态的直接对类进行测试,不开服务,这样才有效率嘛,^_^,
不过httpunit测试页面的过程中有很多麻烦,所以以前进行过一些实践,但都失败告终,
后来没有时间就算了,如果有人对这个有经验希望能共享下。
楼上的,你是做开发还是做测试的?
为什么这么问?
这个有关系吗?
我以前学过一些测试,并对单元测试很感兴趣,
现在做开发,
楼上的问题回答了,
说下为什么这么问吧,
不然bs y,
^_^
使用httpunit进行测试非常麻烦,因为httpunit使用了mozilia的js解释器,造成对现在的部分ie扩展脚本不支持,并且使用httpunit不是谁都可以用的。
jwebunit也只是在上层扩展的httpunit,原理一样,就是好用了一些。


讨论区