测试驱动开发with Junit三.docx

上传人:b****8 文档编号:9231677 上传时间:2023-02-03 格式:DOCX 页数:17 大小:21.36KB
下载 相关 举报
测试驱动开发with Junit三.docx_第1页
第1页 / 共17页
测试驱动开发with Junit三.docx_第2页
第2页 / 共17页
测试驱动开发with Junit三.docx_第3页
第3页 / 共17页
测试驱动开发with Junit三.docx_第4页
第4页 / 共17页
测试驱动开发with Junit三.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

测试驱动开发with Junit三.docx

《测试驱动开发with Junit三.docx》由会员分享,可在线阅读,更多相关《测试驱动开发with Junit三.docx(17页珍藏版)》请在冰豆网上搜索。

测试驱动开发with Junit三.docx

测试驱动开发withJunit三

第三章:

使用mork进行测试开发:

      什么是mork?

简单地说mork就是模型,模拟我们测试时需要的对象及测试数据。

比如,用过Struts的朋友都知道,Struts中的action类要运行必须依靠服务器的支持,只有服务器可以提供HttpServletRequest,HttpServletResponse对象,如果不启动服务器,那么就没有办法对action类进行单元测试(当然了,使用mock测试除外)。

对struts的Action进行测试是很困难的。

即使当业务逻辑很好的被限定在业务层,Strutsaction通常还是会包含很重要的数据验证、数据转换和数据流控制代码。

不对Strutsaction支路进行测试在代码的覆盖率上会有很多的不足。

单单依靠启动服务器运行程序来测试action太过于麻烦。

如果让action脱离容器,那么测试就变得极为简单。

脱离了容器,request与response对象如何获得?

这时可以使用mork来模拟request与response对象,这样测试action类就会变得极为简单。

下面就简单的介绍一下如何使用StrutsTestCase来进行action的测试。

StrutsTestCase介绍

      StrutsTestCase工程提供了一种在JUnit框架下测试strutsaction的灵活、便利的方法。

你可以通过设置请求参数,检查在Action被调用后的输出请求或Session状态这种方式对StrutsAction做白盒测试。

StrutsTestCase提供了用框架模拟web容器的模拟测试方法也提供了真实的web容器(比如:

Tomcat)下的测试方法。

所有的StrutsTestCase单元测试类都源于模拟测试的MockStrutsTestCase或容器内测试的CactusStrutsTestCase。

      下面的例子就是使用mock测试,因为它需要更少的启动和更快的运行。

要使用StrutsTestCase请在下列地址下载最新的发行包

     下面就开始我们的action测试之旅。

首先先让我们了解一下要实现的程序的功能:

在index.jsp中输入班级编号以列表形式在result.jsp页面中显示相关班级学员信息

在result.jsp中点击学员姓名在info.jsp中显示该学生的详细信息。

(注:

这里数据库查询使用基本的jdbc实现,我们假设DAO层已经通过测试,因为这不是我们这里关注的重点,数据库使用SqlServer2000,同时假定你已经具备使用eclipse开发struts的相关知识)

      在pubs数据库中新建一个student表,在表中插入如下测试数据。

 

1.use pubs       

2.go       

3.       

4.create table student       

5.([id] int primary key identity(1,1),       

6.stuName varchar(20) not null,       

7.stuAge int not null,       

8.stuSex varchar(20)not null,       

9.stuClass varchar(20) not null      

10.)       

11.go       

12.       

13.insert into student values('jack',23,'man','GS2T11')       

14.insert into student values('mohindar',24,'man','GS2T11')       

15.insert into student values('tim',21,'man','GS2T11')       

16.insert into student values('rose',23,'woman','GS2T11')       

17.insert into student values('sakura',22,'woman','GS2T11')       

18.    

19.insert into student values('dess',23,'man','GS2T12')       

20.insert into student values('hiruku',24,'man','GS2T12')       

21.insert into student values('lucy',21,'woman','GS2T12')       

22.insert into student values('liky',23,'woman','GS2T12')       

23.insert into student values('desr',22,'woman','GS2T12')       

24.go        

      先让我们来看看第一个功能如何实现:

  

      在search.jsp中填入数据,然后将其提交给SearchAction类来处理。

SearchAction类调用业务逻辑层查询,将结果保存至request对象的属性"result"中,并且跳转至info.jsp页面。

如果查询不到结果,就构造一个ActionMessage,封装错误信息,并转向到error.jsp页面。

     下面的请求URL将会显示调用SearchAction类:

     search.do?

method=search

     具体步骤如下:

     步骤1:

在eclipse中放入strutstests-2.1.3.jar,junit.jar、commons-collections.jar

    

     步骤2:

构造一个名为SearchForm的ActionForm和一个名为SearchAction的action。

SearchForm的属性为:

clazzName

     步骤3:

更改相应的配置文件

 

1.  

2.      

3.form-beans>  

4.  

5.  

6.    

7.        name="searchForm" parameter="method" path="/search" scope="request"  

8.        type="com.struts.action.SearchAction" validate="false">  

9.          

10.          

11.    action>  

12.action-mappings>  

    步骤4:

编写测试类

构造一个名为SearchActionTest的类并继承MockStrutsTestCase。

在该类中添

加测试方法testSearchSuccess

 

1.import servletunit.struts.MockStrutsTestCase;       

2.      

3.public class SearchActionTest extends MockStrutsTestCase       

4.{       

5.   public void testSearchSuccess()       

6.   {       

7.     setRequestPathInfo("/search.do");          //1行       

8.     addRequestParameter("method", "search");  //2行       

9.     actionPerform();                          //3行       

10.  }       

11.}      

      代码解释:

      1行:

设置请求SearchAction类的请求路径

      2行:

在请求路径后加上一个请求参数

               1行与2行就构成了/search.do?

method=search

      3行:

调用actionPerform()来执行action类

      注:

以上代码就是对一个测试方法的初始化。

可以根据需要自行修改

      步骤5:

根据struts-config.xml文件完善testSearch方法。

先验证可以按照班级名称查询出所需要的数据,主要做以下事情:

      a)  初始化提交数据

      b)  验证request中"result"属性是否有值

      c)  是否返回result.jsp页面    

      代码如下:

 

1.public class SearchActionTest extends MockStrutsTestCase       

2.{       

3.    public void testSearchSuccess()       

4.    {       

5.        setRequestPathInfo("/search.do");       

6.        addRequestParameter("method", "search");       

7.            

8.        addRequestParameter("clazzName","gs2t11");      //1行       

9.        actionPerform();       

10.            

11.        assertNotNull(request.getAttribute("result"));  //2行       

12.        verifyForward("success");                       //3行       

13.    }       

14.}      

      代码解释:

      1行:

添加提交数据,该数据就相当与从search.jsp提交的数据

      2行:

查询成功后,将结果放入request中,所以判断result中的"result"属性是否

                有值来断定是否将结果成功放入request对象中。

      3行:

验证查询成功后是否会返回success.jsp页面

      运行junit,如果出现以下错误(具体如下图):

(请参考附件吧。

这里所有的图都省略……)

      那么请在src下建立一个名WEB-INF的目录,将WebRoot下的WEB-INF中的web.xml文件与struts-config.xml文件拷贝过去即可。

如图:

      步骤6:

在SearchAction中用最简单的代码先去实现步骤5中的功能

      代码如下:

           

 

1.public class SearchAction extends DispatchAction  

2.{  

3.    private SearchHandler sh;  

4.  

5.    public ActionForward search(ActionMapping mapping,ActionForm   

6.             form, HttpServletRequest request, HttpServletResponse response)  

7.    {  

8.        SearchFormsearchForm = (SearchForm) form;  

9.        //获取表单中输入的班级  

10.        String className = searchForm.getClazzName();  

11.          

12.        //查询该班级的信息  

13.        sh = new SearchHandler();  

14.        List list=sh.searchByClassName(className);  

15.          

16.        if(list!

=null)  

17.        {  

18.            //将班级信息保存至request中,并返回result.jsp  

19.            request.setAttribute("result",list);  

20.            return mapping.findForward("success");  

21.        }  

22.        else  

23.            return null;  

24.    }  

25.}  

           注释比较详细,就不再多解释了

        运行测试类结果如下(成功部分编写完毕)

       步骤7:

编写不能成功取出数据的测试。

在SearchActionTest类中添加一个名为testSearchFail的方法

      代码如下:

      

 

1.public void testSearchFail()  

2.{  

3.   setRequestPathInfo("/search.do");  

4.    addRequestParameter("method", "search");  

5.          

6.    addRequestParameter("clazzName","gs2txx");       //1行  

7.    actionPerform();  

8.          

9.    verifyActionMessages(new String[] {"no.stuclass.found"});//2行  

10.    verifyForward("error");                            //3行  

11.          

12.   verifyForwardPath("/error.jsp");                              //4行  

13.}  

       代码解释:

      1行:

输入一个不存在的班级

      2行:

验证向ActionMessages中放入的消息文本

      3行:

验证返回地址

      4行:

验证页面地址是否与转向的error对应

     步骤8:

更改SearchAction类,实现步骤7的功能

     代码如下:

(粗体为增加部分)

 

1.public class SearchAction extends DispatchAction  

2.{  

3.    private SearchHandler sh;  

4.  

5.    public ActionForward search(ActionMapping mapping,ActionForm   

6.            form, HttpServletRequest request, HttpServletResponse response)  

7.    {  

8.        SearchFormsearchForm = (SearchForm) form;  

9.        //获取表单中输入的班级  

10.        String className = searchForm.getClazzName();  

11.          

12.        //查询该班级的信息  

13.        sh = new SearchHandler();  

14.        List list=sh.searchByClassName(className);  

15.          

16.        if(list!

=null)  

17.        {  

18.            //将班级信息保存至request中,并返回result.jsp  

19.            request.setAttribute("result",list);  

20.            return mapping.findForward("success");  

21.        }  

22.        else  

23.        {  

24.            //构造一个ActionMessage保存一条消息  

25.             ActionMessages messages=new ActionMessages();  

26.             messages.add(Globals.MESSAGE_KEY, new ActionMess("no.stuclass.found")); 

             saveMessages(request,messages);  

27.            //返回error.jsp  

28.             return mapping.findForward("error");  

29.        }  

30.    }  

31.}  

      运行测试类,正确

      至此第一个功能测试开发完毕

      接着我们一起来完成第二个功能:

                      

      在result.jsp页面中,点击学生的姓名后将其提交给DisplayAction类来处理。

DisplayAction类调用业务逻辑层查询,将结果保存至request对象的属性"stu"中,并且跳转至info.jsp页面

      下面的请求URL将会显示调用SearchAction类:

       display.do?

method=display&stuName=jack

      具体步骤如下:

      步骤1:

构造一个名为DisplayForm的ActionForm和一个名为DisplayAction的Action。

DisplayForm的属性为stuName

      步骤2:

修改相应的struts-config.xml

 

1.  

2.      

3.form-beans>  

4.  

5.  

6.    

7.        name="displayForm" parameter="method" path="/display" scope="request"  

8.        type="com.struts.action.DisplayAction" validate="false">  

9.          

10.    action>  

11.action-mappings>  

      步骤3、编写DisplayAction的测试类DisplayActionTest,在其中加入一个名为testShowInfo()的方法。

该方法完成以下事情:

      a)初始化提交数据

      b)验证request中"stu"属性是否有值

      c)是否返回info.jsp页面

      代码如下:

     

 

1.public class DisplayActioTest extends MockStrutsTestCase  

2.{  

3.    public void testShowInfo()  

4.    {  

5.        setRequestPathInfo("/display.do");  

6.        addRequestParameter("method","display");  

7.        addRequestParameter("stuName", "jack");  

8.          

9.        actionPerform();  

10.          

11.        assertNotNull(request.getAttribute("stu"));  

12.        verifyForward("info");  

13.          

14.    }  

15.}  

 

       步骤4:

更改DisplayAction类,用最简短的代码实现其功能

      代码如下:

 

1.public cla

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1