2008-05-06
用Cactus做容器内单元测试
关键字: 用cactus做容器内单元测试
1.cactus 属于jakarta下面的一个子项目,具体下载地址:http://jakarta.apache.org/cactus/index.html
2. 在web.xml里配置
3.写个Servlet类
对其里面的方法isLogin进行测试
4.测试类:FirstServletTest
A:用浏览器的方式进行测试
TestAll(不需要继承任何类)代码
启动服务,地址栏输入:http://localhost:8080/cactusTest/ServletTestRunner?suite=com.test.TestAll
则会以xml的形式返回测试结果,如果想以html的形式更直观的观察测试结果则需要下载cactus-report.xsl,并将该文件放在当前应用的根目录下。然后地址栏输入:
http://localhost:8080/cactusTest/ServletTestRunner?suite=com.test.TestAll&xsl=cactus-report.xsl,客户端会把服务器返回的xml结果根据该xsl转换成直观的html形式,在客户端进行转换。如果想让服务器端直接返回的是html的形式,而不是xml的形式,那么需要在web.xml里加个<init-param>参数,如下:
这样的话,只需要输入:http://localhost:8080/cactusTest/ServletTestRunner?suite=com.test.TestAll&transform=fds,transform的值可以随意,那么服务器端会自己将xml形式的测试结果直接转换成html,然后返回给客户端,就不需要客户端自己做转换了。
B:像普通的java application应用的TestCase一样直接在IDE里运行测试
FirstServletTest2测试类
1 Cactus的执行流程分为两部分:客户端(Client)与服务器端(Server)
2 客户端部分:首先构造出准备向服务器端发送的请求参数。
客户端通过begin及beginXXX方法构造好请求参数后,与服务器端建立一个HTTP连接,然后向服务器端发送请求
3 服务器端:最重要的类是ServletTestRedirector类,它是一个Servlet,它收到客户端发送来的请求,然后通过反射生成测试类的实例,接下来调用其setUp,textXXX,tearDown方法,执行完毕后,向客户端发送响应(Response)
4. 客户端:收到响应后,执行endXXX,end方法,完成测试流程。
5. 在客户端执行的方法:begin,beginXXX,endXXX,end.
6. 在服务器端执行的方法:setUp,testXXX,tearDown.
也就是说测试类(FirstServletTest2 )被实例化了2次,在客户端实例化了一次,在服务器端也实例化了一次(ServletTestRedirector通过反射生成测试类的实例)
实际上客户端和服务器端进行的是2次连接,第一次是进行请求运行要测试的方法,第二次是将测试结果返回给客户端,即2次连接。只有服务器端的session是有值的,客户端的session是没有值的。
2. 在web.xml里配置
<servlet>
<servlet-name>ServletTestRunner</servlet-name>
<servlet-class>org.apache.cactus.server.runner.ServletTestRunner</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletTestRunner</servlet-name>
<url-pattern>/ServletTestRunner</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletTestRedirector</servlet-name>
<servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletTestRedirector</servlet-name>
<!--这个url-pattern的值必须为/ServletRedirector,不能换成其它-->
<url-pattern>/ServletRedirector</url-pattern>
</servlet-mapping>
3.写个Servlet类
public class FirstServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if(isLogin(request)){
System.out.println("success");
}else{
System.out.println("fail");
request.getSession().setAttribute("user", "users");
}
}
public boolean isLogin(HttpServletRequest request){
if(null == request.getSession().getAttribute("user")){
return false;
}else{
return true;
}
}
}
对其里面的方法isLogin进行测试
4.测试类:FirstServletTest
import junit.framework.Assert;
import org.apache.cactus.ServletTestCase;
public class FirstServletTest extends ServletTestCase {
public void testIsLogin(){
FirstServlet test = new FirstServlet();
boolean result = test.isLogin(request);
Assert.assertEquals(false, result);
}
}
A:用浏览器的方式进行测试
TestAll(不需要继承任何类)代码
import junit.framework.Test;
import junit.framework.TestSuite;
public class TestAll {
public static Test suite(){
TestSuite suite = new TestSuite("test all");
suite.addTestSuite(FirstServletTest.class);
return suite;
}
}
启动服务,地址栏输入:http://localhost:8080/cactusTest/ServletTestRunner?suite=com.test.TestAll
则会以xml的形式返回测试结果,如果想以html的形式更直观的观察测试结果则需要下载cactus-report.xsl,并将该文件放在当前应用的根目录下。然后地址栏输入:
http://localhost:8080/cactusTest/ServletTestRunner?suite=com.test.TestAll&xsl=cactus-report.xsl,客户端会把服务器返回的xml结果根据该xsl转换成直观的html形式,在客户端进行转换。如果想让服务器端直接返回的是html的形式,而不是xml的形式,那么需要在web.xml里加个<init-param>参数,如下:
<servlet>
<servlet-name>ServletTestRunner</servlet-name>
<servlet-class>org.apache.cactus.server.runner.ServletTestRunner</servlet-class>
<init-param>
<param-name>xsl-stylesheet</param-name>
<param-value>cactus-report.xsl</param-value>
</init-param>
</servlet>
这样的话,只需要输入:http://localhost:8080/cactusTest/ServletTestRunner?suite=com.test.TestAll&transform=fds,transform的值可以随意,那么服务器端会自己将xml形式的测试结果直接转换成html,然后返回给客户端,就不需要客户端自己做转换了。
B:像普通的java application应用的TestCase一样直接在IDE里运行测试
FirstServletTest2测试类
package com.test;
import junit.framework.Assert;
import org.apache.cactus.ServletTestCase;
import org.apache.cactus.WebRequest;
import org.apache.cactus.WebResponse;
public class FirstServletTest2 extends ServletTestCase {
/**
*每个测试方法前都会去执行
*/
public void begin(WebRequest request){
System.setProperty("cactus.contextURL", "http://localhost:8080/cactusTest");
System.out.println("begin");
}
/**
*只是在isLogin测试方法前才会去执行
*/
public void beginIsLogin(WebRequest request){
System.out.println("begin isLogin");
}
public void setUp(){
System.out.println("setUp");
}
public void testIsLogin(){
FirstServlet test = new FirstServlet();
boolean result = test.isLogin(request);
Assert.assertEquals(false, result);
}
public void tearDown(){
System.out.println("tearDown");
}
/**
*每个测试方法后都会去执行
*/
public void end(WebResponse response){
System.out.println("end");
}
/**
*只是在isLogin测试方法后才会去执行
*/
public void endIsLogin(WebResponse response){
System.out.println("end isLogin");
}
}
1 Cactus的执行流程分为两部分:客户端(Client)与服务器端(Server)
2 客户端部分:首先构造出准备向服务器端发送的请求参数。
客户端通过begin及beginXXX方法构造好请求参数后,与服务器端建立一个HTTP连接,然后向服务器端发送请求
3 服务器端:最重要的类是ServletTestRedirector类,它是一个Servlet,它收到客户端发送来的请求,然后通过反射生成测试类的实例,接下来调用其setUp,textXXX,tearDown方法,执行完毕后,向客户端发送响应(Response)
4. 客户端:收到响应后,执行endXXX,end方法,完成测试流程。
5. 在客户端执行的方法:begin,beginXXX,endXXX,end.
6. 在服务器端执行的方法:setUp,testXXX,tearDown.
也就是说测试类(FirstServletTest2 )被实例化了2次,在客户端实例化了一次,在服务器端也实例化了一次(ServletTestRedirector通过反射生成测试类的实例)
实际上客户端和服务器端进行的是2次连接,第一次是进行请求运行要测试的方法,第二次是将测试结果返回给客户端,即2次连接。只有服务器端的session是有值的,客户端的session是没有值的。
发表评论
- 浏览: 90764 次
- 性别:

- 来自: 杭州

- 详细资料
搜索本博客
我的相册
bbbb
共 3 张
共 3 张
最近加入圈子
最新评论
-
hibernate知识小结
谢谢!!正好delete那个地方没弄懂!以为delete之后还是持久态!!现在基 ...
-- by 410228573 -
hibernate------HQL总结
谢谢,学习了!
-- by gdjbj2008 -
Extjs2.0---继承
Ext.extend(SubClass,BaseClass,{ ...
-- by yunhaifeiwu -
修改Eclipse注释里的${Da ...
找到eclipse.ini 里面有-Duser.language=en 改为-D ...
-- by duooluu -
sqlserver2005获取连接失 ...
...
-- by gordanmao






评论排行榜