- 浏览: 313417 次
- 性别:
- 来自: 南昌
-
文章分类
最新评论
-
秋风扫落叶:
不错,学习了。shadow文件中记录的格式是什么?
/etc/passwd & /etc/shadow 详解 -
key232323:
重拾jstl——写得很好。我收藏下。
JSTL标签用法 -
zxl10059:
不错,非常简明扼要
Hibernate分页 -
Batmankwok:
很好,所见略同,
自定义组件MXML和as两种实现的方式和区别 -
Dxx23:
摘话回帖!
通过response对象的sendRedirec ...
response.sendRedirect方式的转向与RequestDispatcher的forward方法的比较
传统的Java WEB应用中,核心技术莫过于Servlet类与JSP网页,两者均可以通过HttpUnit程序包完成单元测试。对JSP网页的测试主要集中在判断HTTP服务器返回的内容是否符合要求,并且这种测试只能在WEB容器内进行。对于Servlet类的测试,HttpUnit程序包给出了一个非容器内的测试方案,那就是ServletRunner类的使用。
简单测试
为了测试Servlet类,首先要在ServletRunner中注册Servlet类,例如:
- // 模拟WEB服务器
- ServletRunner sr = new ServletRunner();
- sr.registerServlet( "hello.html", HelloServlet.class.getName() );
上文注册了一个HelloServlet,当程序发出“hello.html”的HTTP请求时,ServletRunner就会调用HelloServlet类予以响应,如:
- // 模拟HTTP客户端
- ServletUnitClient sc = sr.newClient();
- // 创建请求
- WebRequest request =
- new GetMethodWebRequest( "http://localhost/hello.html" );
- // 返回响应
- WebResponse response = sc.getResponse( request );
- // 校验结果
- assertEquals("text/plain", response.getContentType());
- assertEquals("UTF-8", response.getCharacterSet());
- assertEquals("中国", response.getText());
根据上述测试过程,我们的HelloServlet类实现如下:
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class HelloServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- resp.setContentType("text/plain");
- resp.setCharacterEncoding("UTF-8");
- PrintWriter pw = resp.getWriter();
- pw.write("中国");
- }
- }
当然,我们也可以判断Servlet类操作session的过程是否正确,如:
- import junit.framework.TestCase;
- import com.meterware.httpunit.GetMethodWebRequest;
- import com.meterware.httpunit.WebRequest;
- import com.meterware.httpunit.WebResponse;
- import com.meterware.servletunit.ServletRunner;
- import com.meterware.servletunit.ServletUnitClient;
- public class HelloTest extends TestCase {
- public void testHelloServlet() throws Exception {
- ServletRunner sr = new ServletRunner();
- sr.registerServlet("hello.html", HelloServlet.class.getName());
- ServletUnitClient sc = sr.newClient();
- WebRequest request =
- new GetMethodWebRequest( "http://localhost/hello.html" );
- WebResponse response = sc.getResponse( request );
- // 判断session中的值
- assertEquals("darxin", sc.getSession(false).getAttribute("userId"));
- assertEquals("text/plain", response.getContentType());
- assertEquals("UTF-8", response.getCharacterSet());
- assertEquals("中国", response.getText());
- }
- }
相应的,我们的Servlet类会做如下改动:
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class HelloServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- // 向session中设置属性
- req.getSession().setAttribute("userId", "darxin");
- resp.setContentType("text/plain");
- resp.setCharacterEncoding("UTF-8");
- PrintWriter pw = resp.getWriter();
- pw.write("中国");
- }
- }
高级应用
上述两例均属于在Servlet类中直接打印响应信息的情况,在实际应用中这种调用已经很少见了。通常我们会利用MVC架构实现Servlet类与JSP网页的功能分离。例如使用Servlet类完成Controller的任务;使用JSP网页完成View的任务。
下图展示了一个典型的利用MVC架构实现HTTP响应的过程:
根据这个图可以看出,第五步会在Servlet类用到转向操作,转向操作的方法如下例:
如何测试具有转向功能的Servlet类呢?首先要明确对于这一类Servlet,我们要测试它们的什么功能:
第一, Servlet类在转向前都保存了哪些数据?保存这些数据的位置在哪儿?
第二, Servlet类是否转向到正确的位置上了?
需要注意的是,通常情况下作为Controller的Servlet类是要转向到作为View的JSP网页的,但是HttpUnit程序包不提供解析JSP网页的方法。为此,我们可以利用stub技术,利用另一个Servlet类为其模拟一个转向目标。
模拟转向目标的任务有两个:
第一, 从数据保存区提取相关的数据;
第二, 将相关的数据以响应的方式向用户端发送。
作为stub的Servlet类不需要进行数据的有效性判断。样例代码如下:
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class MainStub extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- // 从数据保存区提取相关的数据
- String userId = (String)req.getAttribute("userId");
- resp.setContentType("text/plain");
- resp.setCharacterEncoding("UTF-8");
- // 将相关的数据以响应的方式向用户端发送
- PrintWriter pw = resp.getWriter();
- pw.write(userId);
- }
- }
相应的,用户端测试代码的任务是:
第一, 注册需要测试的Servlet类与用作stub的Servlet类;
第二, 模拟调用需要测试的Servlet类并为其提供参数;
第三, 检查从用作stub的Servlet类中返回的响应数据是否符合要求。
样例代码如下:
- import junit.framework.TestCase;
- import com.meterware.httpunit.GetMethodWebRequest;
- import com.meterware.httpunit.WebRequest;
- import com.meterware.httpunit.WebResponse;
- import com.meterware.servletunit.ServletRunner;
- import com.meterware.servletunit.ServletUnitClient;
- public class HelloTest extends TestCase {
- public void testHelloServlet() throws Exception {
- ServletRunner sr = new ServletRunner();
- // 注册测试用Servlet
- sr.registerServlet("hello.html", HelloServlet.class.getName());
- // 注册stub用Servlet
- sr.registerServlet("main.html", MainStub.class.getName());
- ServletUnitClient sc = sr.newClient();
- // 调用测试用Servlet并为其提供参数
- WebRequest request =
- new GetMethodWebRequest( "http://localhost/hello.html?userId=darxin" );
- WebResponse response = sc.getResponse( request );
- // 检查最终的返回结果
- assertEquals("darxin", response.getText());
- }
- }
根据测试代码及stub代码,我们最终需要完成的Servlet类代码如下:
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class HelloServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- // 从请求中取出参数
- String userId = req.getParameter("userId");
- // 向request中设置属性
- req.setAttribute("userId", userId);
- // 转向到新的servlet
- req.getRequestDispatcher("main.html").forward(req, resp);
- }
- }
以上简要说明了如何利用HttpUnit程序包测试Servlet的方法,此方法适用于基本的Servlet实现。
对于容器内测试,建议使用Cactus技术。
发表评论
-
web.xml tomcat 和jetty 区别
2010-09-07 09:31 2218因为使用GWT,所以测试的时候是在jetty上运行的,但是最后 ... -
单元测试之实践四 Action的测试
2010-08-30 10:14 897Action的测试是比较辛苦的。因为它依赖与其他的环境(比如t ... -
单元测试之实践三 Service的测试
2010-08-30 10:13 1022测试Service,因为Service依赖的Dao, 所以只需 ... -
单元测试之实践二,关于DAO的测试
2010-08-30 10:12 1000前阵子发表过 我的第一个真正意义上的测试 。里面对于测试S ... -
Mockito特点
2010-08-30 10:02 11491. 只能使用jdk1.5以上,因为它的方便是用jdk1.5的 ... -
HttpUnit进行Web测试
2010-08-30 00:06 1739简介:HttpUnit是基于JUnit ... -
关于单元测试的一些看法
2010-08-28 14:26 952从参加工作以来,参加 ... -
Eclipse IDE下 Cactus + Jetty 对 Servlet 的测试
2010-08-28 13:09 1604在开发J2EE Web项目时,测试过程常涉及到代码与Web C ... -
用cactus,jetty实现对servlet类进行单元测试三(完)
2010-08-28 11:39 1154OK,可以开始写测试类了,代码为: pa ... -
用cactus,jetty实现对servlet类进行单元测试二
2010-08-28 11:37 1413按照官网的定义,我们就可以用MILY: 'Arial','sa ... -
用cactus,jetty实现对servlet类进行单元测试一
2010-08-28 11:35 1425JUnit是名声大燥了,想必只要学过JAVA的人都知道世上有个 ... -
相关测试工具下载
2010-08-26 17:21 1496相关测试工具下载 HP-Mercury软件测试工具下载,随时 ... -
单元测试实践小结
2010-08-26 16:40 663在系统开发过程种使用单元测试,会带来很多的的好处,最明显为: ... -
软件测试杂录
2010-08-26 14:41 1137比较杂,有空再整理一 ... -
J2EE单元测试
2010-08-26 11:06 1098一、测试原则 Java ... -
使用 EasyMock 更轻松地进行测试
2010-08-25 14:40 1028测试驱动开发是软件开发的重要部分。如果代码不进行测试,就是不可 ... -
Cactus工作原理
2010-08-24 09:52 1028Cactus 是Jakarta的子项目 ... -
Cactus实例讲解
2010-08-23 17:08 948Cactus简介 . 简介 Cactus实现了对JUni ... -
flex和java的通信
2010-08-17 15:35 755一、准备: 服务端:J ... -
Flash 聊天室
2010-08-17 11:39 1043今天我们来制作 Flash 聊天室,学习使用 Socket 类 ...
相关推荐
7. **兼容性**:HttpUnit与Servlet和JSP标准兼容,因此对基于这些技术构建的Web应用特别有用。 8. **易于集成**:它能很好地与JUnit或其他测试框架结合,方便构建自动化测试套件。 通过"www.pudn.com.txt"文件,...
以下是使用Junit和httpunit测试Servlet的基本步骤: 1. **创建测试类**:在Java项目中创建一个新的类,继承自Junit的`@RunWith(MockitoJUnitRunner.class)`或者使用`@ExtendWith(SpringExtension.class)`(如果使用...
例如,测试Servlet时,你可以利用`ServletTestCase`提供的隐含对象准备HTTP参数,然后通过Redirector Proxy执行测试流程。测试Filter时,你可以访问由Container管理的`HttpServletRequestWrapper`、`...
Web应用程序通常需要集成到Servlet容器中,这使得测试的复杂性增加。为了确保测试的可靠性和可重复性,开发者可以借助像JUnit和TestNG这样的测试框架。这些框架提供了断言方法,通过简单的布尔逻辑来验证预期的行为...
JUnit和其他测试框架可以用于测试Action类和ActionForm,而模拟HTTP请求的工具如HttpUnit可以帮助测试视图和控制器。 通过理解以上关键点,开发者可以更好地应对Struts开发中的挑战,并提升应用的效率和质量。此外...
对于Struts应用,可以使用模拟请求工具(如HTTPUnit或Selenium)来测试Action和视图的交互。 总的来说,这个Struts图书馆管理系统展示了如何利用MVC模式和Struts框架来构建一个完整的Web应用,涵盖了用户注册、登录...
10. **HTTPUnit**: `httpunitdemo`是一种网页抓取技术,可以执行JavaScript,模拟用户行为,适用于自动化测试和数据抓取。 11. **Base64图像处理**: `imgdemo`演示了Base64编码和解码在图片与文件之间的转换,常...