StrutsTestCase 之discovery

转载 2006年06月15日 09:39:00
StrutsTestCase 之discovery
StrutsTestCase用于对基于Struts框架的Web应用进行单元测试,它可以用来测试ActionForm,Action的Execute方法,Action Forward, 及转向后的JSP是否正确。一个典型的Case代码如下:
 
        setRequestPathInfo("/DriveBus");
        addRequestParameter("driver", "tang");
        actionPerform();
        verifyForward("success");
 
就这样的短短几行代码,在实际运行过程中却遇到很多问题。
 
1. junit.framework.AssertionFailedError: Error initializing action servlet: Unable to find /WEB-INF/web.xml.  TestCase is running from D:/ide/eclipse3.0.1/workspace/ztest directory.  Context directory has not been set.  Try calling setContextDirectory() with a relative or absolute path.  /WEB-INF/web.xml must be found under the context directory, the directory the test case is running from, or in the classpath.
 这个错误原因是没有找到web-inf/web.xml所在的目录。一般被测代码和测试的代码不是在一个工程下的。如下图的结构所示:
   projects
   |-myWeb
   |   |-src
   |   |-WEB-INF
   |      |-classes
   |      |-lib
   |  
   |      | struts-confg.xml
   |      | web.xml
   |  
   |-test
       |-src
 
test工程包含所有用来测试myWeb工程的TestCase,这时候就需要覆写MockStrutsTestCase里的setup()方法:
    protected void setUp() throws Exception
    {
        // TODO Auto-generated method stub
        super.setUp();
        setContextDirectory(new File("../myWeb"));
    }
SetContextDirectory()方法保证TestCase能正确找到web.xml和struts-config.xml文件。
 
2。setRequestPathInfo()用来设置页面的form提交时执行的action,如jsp中form代码为:<FORM action="DriveBus.do" method="post">,则应该写成setRequestPathInfo("/DriveBus").
注意该函数的参数:
   1)DriveBus前面的左斜杠是必需的。
   2)不能包含context路径。
   3)在后面加上.do是没有问题的。
 
3。setRequestPathInfo()存在的问题
 当调用该方法时,会调用Common中的stripActionPath()进行处理,当setRequestPathInfo()的传入参数为“/DriveBus.do”时,会被截成“/DriveBus”,它将会设置到request的pathinfo字段。问题就在这里。
在StrutsTestCase中,对容器内的request进行了模拟,用HttpServletRequestSimulator代替真正的HttpServletRequest。对于部署在容器里的应用,如下函数的输出分别为:
    request.getPathInfo()    null
    request.getRequestURI()     /myWeb/DriveBus.do
    request.getRequestURL()     http://localhost:8080/myWeb/DriveBus.do
    request.getServletPath()    /DriveBus.do
而模拟的request得出的输出为:
    request.getPathInfo()    /DriveBus
    request.getRequestURI()     null
    request.getRequestURL()    null
    request.getServletPath()     null
可见,HttpServletRequestSimulator并没有能够很好地模拟request,当被测程序中调用了request.getPathInfo()以外的方法时,测试很可能不会通过(抛NullPointerException异常),或者会出现错误的测试结果。
 
4。多模块测试
StrutsTestCase支持对多模块的测试,在setRequestPathInfo()中可以指定模块名称,setRequestPathInfo(String moduleName, String pathInfo),其部分代码如下:
    this.actionPath = Common.stripActionPath(pathInfo);
        if (moduleName != null) {
            if (!moduleName.equals("")) {
                if (!moduleName.startsWith("/"))
                    moduleName = "/" + moduleName;
                if (!moduleName.endsWith("/"))
                    moduleName = moduleName + "/";
            }
            if (logger.isDebugEnabled()) {
                logger.debug("setting request attribute - name = " + Common.INCLUDE_SERVLET_PATH + ", value = " + moduleName);
            }
            this.request.setAttribute(Common.INCLUDE_SERVLET_PATH, moduleName);
        }
        this.request.setPathInfo(actionPath);
        this.requestPathSet = true;
它将传入的模块名名设置到request的Common.INCLUDE_SERVLET_PATH属性,但是在verifyForwardPath()的代码中却有这样一段:
   String moduleName = request.getServletPath() != null ? request.getServletPath() : "";
        if ((moduleName == null || moduleName.equalsIgnoreCase("")) && request.getAttribute(INCLUDE_SERVLET_PATH) != null)
            // check to see if this is a MockStrutsTestCase call
            moduleName = (String) request.getAttribute(INCLUDE_SERVLET_PATH);
当可以取到ServletPath时,将其值作为moduleName,这个真是让人想不通!!servletPath和模块名有什么关系呢?
 
 (对于URI, URL, URN的详细说明见:http://www.ietf.org/rfc/rfc1738.txt,所以StrutsTestCase对HttpServletRequest的模拟是不符合规范的)
 
5。contextPath
这个值始终是空字符串
 
总之,当我们使用StrutsTestCase进行测试时,需要对以上问题多加留意,当出错时,可能会是StrutsTestCase本身的问题,必要的话,可以对其进行源码进行修改,以适合我们系统本身的需求。StrutsTestCase的license是 Apache Software License。
 
附: Apache Software License (ASL)可以兼容其它任何已知的许可证。 已知的最大例外是GNU Public License (GPL) 和Lesser GNU Public License (LGPL). 重要的是ASL对合作开发相当友好,如果您不想的话,也不会强迫您发布源代码。 Apache Software Foundation名下的德高望众的HTTP服务器用的是相同的许可证。
(完)

相关文章推荐

StrutsTestCase工程例子

  • 2008年11月04日 10:31
  • 1.75MB
  • 下载

StrutsTestCase配置的常见问题及其多级Action的处理方式

StrutsTestCase的配置的常见问题及其简单的测试用例

Struts2+Spring的UnitTest编写(使用StrutsTestCase的子类StrutsSpringTestCase)

我们都知道struts2有自己的对象工厂即obejectFactory,但是你也可以使用spring来作为对象工厂,继承了spring之后的单元测试要加什么东西呢?       答案是要加入下面的这...

总结教训:stm32f4-Discovery驱动三星s6d1121液晶程序

搞了几天!最后总结一句!看文档不仔细,就是坑爹!是严重坑爹!   刚开始,这块液晶,我拿stc12c5a60s2来驱动,能点亮! 然后把51上的驱动,移植到F4里。到F4下测,死活都是白屏,刚开...
  • wzs298
  • wzs298
  • 2013年09月22日 03:49
  • 4244

stm32f4 discovery开发板usb全速修改测试

===============================   博客点滴积累,部分话语和知识点来源于网络,感谢网络资源的提供者====== 时间有点长了,根据映像写的,哎,以后做记录要及时呀...

hogan uomo the discovery has been canceled. Metro staff told him that the one-way ticket back are p

in fact, one-way ticket in addition to the purchase of the station into the Station, the Station is ...

Microservice Registration and Discovery with Spri

Microservice Registration and Discovery with Spri 更多0 The microservice style of architecture...
  • lzy_168
  • lzy_168
  • 2015年03月05日 16:38
  • 1450

Newtown Slots "The Discovery" Adventure Slot Machine!(ibet, newtoawn casino malaysia, newtown, Newt)

The Discovery Newtown casino slot machine is the 5 reels and 25 paylines to find all riches of the S...

Zabbix discovery disk 监控

Zabbix discovery Disk 监控Zabbix自带的“Template OS Linux”模板支持监控已挂载的磁盘空间利用率,是利用LLD(Low-level discovery)实现的...

onvif 笔记五(discovery client)

onvif discovery 客户端 其他部分源码参见之前的博文。 #include #include #include #include #include #include ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:StrutsTestCase 之discovery
举报原因:
原因补充:

(最多只允许输入30个字)