J2EE项目实训Struts框架技术——第9章 基于Struts框架的单元测试技术(第3部分)_第1页
J2EE项目实训Struts框架技术——第9章 基于Struts框架的单元测试技术(第3部分)_第2页
J2EE项目实训Struts框架技术——第9章 基于Struts框架的单元测试技术(第3部分)_第3页
J2EE项目实训Struts框架技术——第9章 基于Struts框架的单元测试技术(第3部分)_第4页
J2EE项目实训Struts框架技术——第9章 基于Struts框架的单元测试技术(第3部分)_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料第9章 基于struts框架的单元测试技术(第3/3部分)1.1 在bbs论坛系统应用stc单元测试技术在基于mvc架构模式而设计开发的web应用系统中的模型层组件,可以应用标准的junit单元测试技术进行测试开发,而对于控制层组件应该采用strutstestcase测试框架进行系统开发测试。因此,junit与strutstestcase相互配合,可以解决struts框架的应用系统在开发中的单元测试问题。本节将介绍如何在bbs论坛系统中应用strutstestcase单元测试技术实现对系统中的各个action组件类进行单元测试。为了减少本

2、书的篇幅,对示例程序进行了简化,并除掉了一些无关的功能实现代码。 1.1.1 构建本示例项目的测试环境1、新建一个测试的项目(该项目可以为标准的java项目)在eclipse开发工具的主菜单中依次点击【file】,然后选择【new】,并在弹出的下拉菜单中选择【project】子菜单,然后在弹出的对话框窗口中选择【java 项目】类型,将进入到下面的图9.11中所示的【新建java 项目】创建向导的对话框。在【项目名】输入条中输入项目的名称为teststrutsproject。最后的操作结果请见图9.11所示。图9.11 新建一个名称为teststrutsproject的java测试的项目2、将

3、测试过程中所需要的外部系统库加入到本测试项目中1)将strutstestcase和junit所需要的jar包加入到本测试项目中由于在测试过程中需要应用junit测试框架和strutstestcase测试框架,因此应该将这两个测试框架的系统包文件添加到本测试项目中的classpath环境中。具体操作实现是进入图9.12所示的测试项目的属性对话框,并在该属性对话框中添加对应的jar包文件。图9.12 进入测试项目的属性对话框在图9.12所示的测试项目的属性对话框中,点击【添加外部jar】按钮后,将出现图9.13所示的【选择jar】的对话框。在该对话框中,定位到junit测试框架和strutstes

4、tcase测试框架的目标jar包的目录下,并选中对应的jar文件名称(本示例为junit-3.8.1.jar和strutstest-2.1.3.jar)。最后的操作结果请见图9.13所示。图9.13 选中对应的*.jar文件名称在图9.13所示的【选择jar】的对话框中,点击【确定】按钮后,最后将产生出下图9.14所示的状态结果,实现将junit和strutstestcase的目标*.jar包文件添加到项目中。2)将j2ee web技术中所需要的servlet和jsp的*.jar包加入在图9.14所示的测试项目的属性对话框中,点击【库】页中的【添加库】按钮后,将出现图9.15所示的【添加库】的

5、对话框。在该对话框中,选中【j2ee 1.4 library set】项目。图9.14 最后的结果状态图示然后在图9.15所示的对话框中再点击【下一步】按钮后,将出现图9.16所示的对话框。在该对话框中选中【myeclipse lib home/1.4/javax.servlet.jar】项目和【myeclipse lib home/1.4/jsp-api.jar】项目。最后的操作结果请见图9.16所示。图9.15选中【j2ee 1.4 library set】项目图9.16 添加servlet和jsp的*.jar包在图9.16所示的对话框中再点击【确定】按钮,将添加servlet和jsp的*

6、.jar包到测试项目的classpath环境中。最后的操作结果请见图9.17所示。图9.17 添加servlet和jsp的*.jar包后的结果状态图示3)再添加commons-collections.jar包文件在图9.17所示的测试项目的属性对话框中,点击【添加外部jar】按钮后,将出现【选择jar】的对话框(请见前面的图9.13所示)。在该对话框中,定位到commons-collections.jar包文件所在的目录下,并选中commons-collections.jar包文件名称。最后的操作结果请见图9.18所示。图9.18 添加commons-collections.jar包文件后的状

7、态图示3、将待测试的struts的应用工程引入到本测试的工程中由于在测试工程中需要引用被测试工程中的有关类和资源,因此应该将待测试的struts的应用工程引入到本测试的工程中,从而可以在测试工程中使用struts的应用工程中的有关类。在图9.18所示的测试项目的属性对话框中,切换到【项目】页、并点击【添加】按钮,然后将弹出图9.19所示的【选择必需的项目】对话框。在弹出的【选择必需的项目】对话框中,选中待测试的struts的应用工程的名称strutswebproject。最后的操作结果请见图9.19所示。在图9.19所示的对话框中再点击【确定】按钮,将待测试的struts的应用工程引入到本测试

8、的工程中。最后的操作结果请见图9.20所示。4、添加log4j的属性配置文件和对应的jar包文件1)添加log4j的属性配置文件右击测试工程的根目录,并在弹出的菜单中选择【新建】菜单中的【新建文件】子菜单。将弹出下面的图9.21所示的对话框,在该对话框的【文件名】输入条中输入文件名称为perties。最后的操作结果请见图9.21所示。图9.19 在【选择必需的项目】对话框中选中待测试的struts的应用工程图9.20 将待测试的struts的应用工程引入到本测试的工程中的图示图9.21 添加log4j的属性配置文件perties2)设计pe

9、rties文件内容,请见【例9-8】所示【例9-8】perties文件的内容示例log4j.rootlogger=debug, stdout, logfilelog4j.appender.stdout=org.apache.log4j.consoleappenderlog4j.appender.stdout.layout=org.apache.log4j.patternlayoutlog4j.appender.stdout.layout.conversionpattern=%d %p %c - %nlog4j.appender.logfile=org.apache.log4j

10、.rollingfileappenderlog4j.appender.logfile.file=mylog.loglog4j.appender.logfile.maxfilesize=512kb# keep three backup files.log4j.appender.logfile.maxbackupindex=3# pattern to output: date priority category - messagelog4j.appender.logfile.layout=org.apache.log4j.patternlayoutlog4j.appender.logfile.la

11、yout.conversionpattern=%d %p %c - %m%n3)添加与log4j有关的jar包文件在图9.17所示的测试项目的属性对话框中,点击【添加外部jar】按钮后,将出现【选择jar】的对话框(请见图9.13所示)。在该对话框中,定位到log4j的jar包文件所在的目录下,并选中commons-logging-1.0.4.jar包和log4j-1.2.11.jar文件名称。最后的操作结果请见图9.22所示。图9.22 添加log4j的jar包文件的结果状态的图示1.1.2 分析和设计测试用例类1、确定测试的目标1)“我们需要测试什么”对测试用例程序本身的编程实现,从技术应

12、用的角度来看是没有什么复杂性的。但问题的关键是,开始进行单元测试、特别是测试用例的编程时,首先要自我提问这样一个问题:“我们需要测试什么”首先确定出测试的目标,也就是要获得和了解被测试的功能类有那些“功能点”。2)确定测试目标针对前面【例9-5】中所示的某个实现用户登录功能的action组件类的代码示例,可以设计出如下的几方面的测试目标。 l 如果用户提供合法的登录请求的身份参数,struts框架系统能否正确地创建出包含该请求参数的userloginform 组件对象实例吗?l 包装用户登录表单数据的userloginform组件类能否正常地工作?其中的数据验证validate方法能够正确地进

13、行表单数据的检查吗?l 如果用户所提供的用户名称或者密码不正确,那么struts框架系统的action类能否正确地将错误信息传递到表示层的jsp页面中?并且能否正确跳转回用户的登录页面?l 如果用户提供正确的用户名称和密码,被测试的struts系统中的action类能否跳转到我们所要求的jsp页面?并且在整个过程中不会产生出错误信息?同时httpservletrequest对象是否能够正确地保存在action类中所转发来的数据?2、验证用户是否没有输入用户名或密码的测试目标实现1)测试的目的通过验证用户没有输入用户名或密码时的应用场景,然后向用户显示出适当的错误信息,并将用户重定向到登录页面。

14、2)实现的方法可以在 mockstrutstestuserloginaction测试用例类中创建出一个测试方法testloginactiondataformaterror(),下面【例9-9】所示为实现该测试目标的代码示例。在代码中没有调用addrequestparameter()方法时,将模拟在表单中没有输入请求的参数,然后向用户显示适当的错误提示信息,并将用户重定向到登录页面中。【例9-9】验证用户没有输入用户名或密码的测试目标实现的代码示例public void testloginactiondataformaterror() setcontextdirectory(newfile(c:

15、/jakarta-tomcat-5.0.19/webapps/strutstestuserlogin); setconfigfile(/web-inf/struts-config.xml); setrequestpathinfo(/userloginuri); actionperform();/触发请求 string actionerrors = userlogin.inputerror; verifyactionerrors(actionerrors); verifyinputforward();在编写strutstestcase的测试用例时,要做的第一件事就是告诉strutstestcas

16、e要测试哪个 actionmapping 类,在这里要测试userinfoaction组件类,它被映射到 struts-config.xml 文件中的 /userloginuri 请求路径,因此在测试用例的代码中必须调用 setrequestpathinfo(/userloginuri)方法。在默认情况下,strutstestcase测试框架在应用系统的/web-inf/文件夹中查找 struts-config.xml 文件。如果在系统的classpath路径中没有这个文件(在本示例中,没有采用将它放入到classpath中),就必须用 struts-config.xml 文件的完整路径调用

17、setcontextdirectory()和setconfigfile()方法。通过调用 actionperform() 方法,把控制权传递给 struts 框架以执行测试用例。一旦控制权从 actionpeform() 方法返回,就可以继续调用 verifyxxx() 方法,验证对程序中的各种假设是否成立。3)对测试代码的说明在本示例的应用程序中,希望测试一下在没有用户名和口令输入的时候,调用userinfoaction映射是否会利用出错信息 actionerrors(用于 userlogin.inputerror)将用户重定向到登录页面userlogin.jsp。l verifyactio

18、nerrors()方法可以用 string 数组调用 verifyactionerrors()方法,该数组中的各个元素对象指出作为这个事务的结果-错误信息对象。为了能够设置 userlogin.inputerror错误信息对象的key键名称和创建出actionerrors对象,所以创建了一个 string 数组来保存这些出错信息,并把它们发送给 verifyactionerrors() 方法。l verifyinputforward() 方法该方法检查这个事务的结果是否把用户重定向到动作映射的输入属性指定的页面,在本示例中,该页面应该是 userlogin.jsp。3、测试无效登录的测试目标的

19、实现1)测试的目的由于在本例的userinfoaction组件类中主要是依据用户名称和密码来判断用户登录的合法性,用户名称为“yang”并且密码为“12345678”时,根据业务规则才认为是有效的用户。2)实现的方法为此在本测试中故意将用户名称或者密码设置为错误的状态(请见【例9-10】中的黑体部分的代码),然后再进行测试。当控制权从 actionperform() 返回之后,就可以检查是否利用userlogin.inputerror这条出错信息把用户重定向到登录错误的信息显示的页面中。下面的【例9-10】所示为具体的实现代码示例。【例9-10】测试无效登录的测试目标的实现代码示例public

20、 void testfailedlogin() setcontextdirectory(newfile(c:/jakarta-tomcat-5.0.19/webapps/strutstestuserlogin); setconfigfile(/web-inf/struts-config.xml); setrequestpathinfo(/userloginuri); addrequestparameter(username,yang); addrequestparameter(userpassword,1234); actionperform(); verifyforward(loginfai

21、lure); /或者采用 verifyforwardpath(/loginfailure.jsp); string actionerrors = userlogin.inputerror; verifyactionerrors(actionerrors); 4、测试有效登录测试目标的实现1)测试的目的验证用户如果输入正确的用户名和口令时,是否能够跳转到登陆成功的页面。同时,也将测试request对象的正确性以及actionerrors对象的正确性(也就是不应该再产生出错误)。2)实现的方法在本测试代码段中首先在请求参数中把用户名设置为yang,并把口令设置为 12345678,然后再调用 ac

22、tionperform()方法以触发请求。在执行 actionperform() 方法时,需要调用 verifyforward() 方法,检查用户是否被重定向到成功页面。它还调用了 verifynoactionerrors() 方法,以验证在这个事务中没有出现过错误(也就是actionerrors对象中应该没有actionerror对象)。具体实现的代码请见前面的【例9-6】所示。1.1.3 编程实现测试用例类的代码1、在测试项目中添加一个测试用例类(testcase)1)添加针对userinfoaction的测试用例类右击测试项目,在弹出的快捷菜单中选择【新建】菜单中的【junit 测试用例

23、】菜单项目,然后将弹出图9.23所示的对话框。在该对话框中的【名称】输入条中输入类名称为mockstrutstestuserloginaction,而在【包】输入条中输入测试用例类的包名称为com.px1987.stcexample.userlogintest,在【超类】输入条中输入超类为servletunit.struts.mockstrutstestcase,而被测试的类选择为目标action组件类com.px1987.struts.action.userloginaction。最后的操作结果请见图9.23所示。图9.23 添加针对userinfoaction的测试用例类2)选择被测试的方

24、法在图9.23所示的对话框中,点击【下一步】按钮,将出现下图9.24所示的对话框。然后选择被测试的方法,本示例为execute方法。最后的操作结果请见图9.24所示。在图9.24所示的对话框中,点击【确定】按钮后,eclipse工具将自动生成一个测试用例类的框架型代码。然后在该框架型代码的基础上进一步地编程实现各个测试方法。图9.24 选择被测试的方法2、编程mockstrutstestuserloginaction测试用例类的代码根据在上一节中对测试用例类的功能实现所做的分析和设计工作,编程该mockstrutstestuserloginaction测试用例类的代码,在该类中提供testlo

25、ginactiondataformaterror、testsuccessfullogin和testfailedlogin方法。并对每个方法进行具体的功能实现,完整的实现代码请见【例9-11】所示。【例9-11】mockstrutstestuserloginaction类的代码示例package com.px1987.stcexample.userlogintest;import servletunit.struts.mockstrutstestcase;import junit.framework.*;import java.io.*;public class mockstrutstestus

26、erloginaction extends mockstrutstestcase public mockstrutstestuserloginaction(string arg0) super(arg0);protected void setup() throws exception super.setup();protected void teardown() throws exception super.teardown(); public void testloginactiondataformaterror() setcontextdirectory(newfile(c:/jakart

27、a-tomcat-5.0.19/webapps/strutstestuserlogin); setconfigfile(/web-inf/struts-config.xml); setrequestpathinfo(/userloginuri); actionperform();/触发请求 string actionerrors = userlogin.inputerror; verifyactionerrors(actionerrors); verifyinputforward(); public void testsuccessfullogin() setcontextdirectory(

28、newfile(c:/jakarta-tomcat-5.0.19/webapps/strutstestuserlogin); setconfigfile(/web-inf/struts-config.xml); setrequestpathinfo(/userloginuri); addrequestparameter(username,yang); addrequestparameter(userpassword,12345678); actionperform(); verifyforward(loginsuccess); verifyforwardpath(/loginsuccess.j

29、sp); assertequals(yang,request.getattribute(username); assertequals(12345678,request.getattribute(userpassword); verifynoactionerrors();public void testfailedlogin() setcontextdirectory(newfile(c:/jakarta-tomcat-5.0.19/webapps/strutstestuserlogin); setconfigfile(/web-inf/struts-config.xml); setreque

30、stpathinfo(/userloginuri); addrequestparameter(username,yang); addrequestparameter(userpassword,1234); actionperform(); verifyforward(loginfailure); /或者采用 verifyforwardpath(/loginfailure.jsp); string actionerrors = userlogin.inputerror; verifyactionerrors(actionerrors); 3、执行该测试用例类mockstrutstestuserl

31、oginaction1)启动junit的测试运行器右击测试用例类mockstrutstestuserloginaction,在弹出的快捷菜单中选择【运行方式】菜单中的【junit 测试】菜单项目,将启动junit的测试运行器。具体的操作方式请见图9.25所示。2)产生出执行结果junit的测试运行器将会自动地执行测试用例类mockstrutstestuserloginaction中的各个测试方法,并根据每个测试方法的运行结果产生出成功的状态图示,具体请参考下图9.26所示的执行结果。3)故意产生错误以验证测试结果是否符合逻辑性将测试用例类中的testsuccessfullogin方法中的用户密

32、码故意改变为错误的密码输入值,本示例改变为123456,请见图9.27所示的修改状态的图示。图9.25 启动junit的测试运行器图9.26 本示例的测试用例类执行的结果图9.27 故意产生错误以验证测试的逻辑性然后再次执行本测试用例类mockstrutstestuserloginaction后,将出现下图9.28所示的错误状态的结果内容的图示。因此,可以了解到测试结果是符合逻辑性的不正确的身份信息将不能正确地进行登陆。图9.28 将出现错误状态的结果内容图示1.2 本章小结1、本章的学习重点“频繁测试、持续重构”是提高软件系统程序代码质量的一种有效手段。因此,为了能够编程出高质量的程序代码,开发人员不仅要熟练地掌握

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论