还剩3页未读,继续阅读
文本内容:
trxtd代码实例import junit.framework.*;import java.util.Vector;public classVectorTest extendsTestCaseprotected VectorfEmpty;protected VectorAFuIl;public VectorTestStringnamesupername;public staticvoid mainString[]argsjunit.textui.TestRunner.run suite;protected voidsetUpfEmpty=new Vector;fFull=new Vector;fFulLaddElementnew Integerl;fFuIl.addElementnew Integer2;fFull.addElementnew Integer3;public staticTest suitereturn newTestSuiteVectorTest.class;public voidtestCapacityOint size=fFull.size;for inti=0;i100;i++fFulLaddElementnew Integeri;assertTruefFull.size==100+size;}public voidtestCloneVector clone=VectorfFulLclone;assertTrueclone.size==fFulLsize;assertTrueclone.containsnew Integerl;public voidtestContainsassertTruefFull.containsnew Integerl;assertTrue!fEmpty.containsnew Integerl;public voidtestElementAtInteger i=IntegerfFull.elementAtO;assertTruei.intVa!ue==1;tryInteger j=IntegerfFull.elementAtfFull.size;}catch ArraylndexOutOfBoundsExceptionereturn;failShould raisean ArrayIndexOutOfBoundsExceptionH;public voidtestRemoveAllfFull.removeAllElements;fEmpty.removcAllElements;assertTruefFuILisEmptyO;assertTruefEmpty.isEmptyO;public voidtestRemoveElementfFull.removeElcmcntncw Integer3;assertTrue!fFull.containsnew Integer3;import junit.framework.*;import junit.runner.BaseTestRunncr;public classAllTestspublic staticvoid mainString[J argsjunit.textui.TestRunner.runsuite;}public staticTest suiteTestSuite suite=new TestSuiteFrameworkTests;suite.addTestSuiteExtensionTest.class;suite.addTestSuiteTestCaseTest.class;suite.addTestSuiteTest.suite;suite.addTestSuiteExceptionTestCaseTest.class;suite.addTestSuiteTestListenerTest.class;suite.addTestSuiteActiveTestTest.class;suite.addTestSuiteAssertTest.class;suite.addTestSuiteStackFilterTest.class;suite.addTestSuiteSorterTest.class;suite.addTestSuiteRepeatedTestTest.class;suite.addTestSuiteTestlmplementorTest.class;if!BaseTestRunner.inVAJavasuite.addTestSuiteTextRunnerTest.class;if!isJDKll suite.addTestnew TestSuiteTestCaseClassLoaderTest.class;return suite;}static booleanisJDKl1String version=System.getPropertyjava.version;return version.startsWith
1.1”;2整合测试的观念与Cactus应用整合测试提供了J2EE Container的环境,可以快速轻易地检验出Domain Object与J2EE Container的互动行为是否合乎逻辑因此整合测试的对象是以一个EJB、Servlet或是JSP的程序代码为基本单元Open Source社群的Jakarta计划中的子计划Cactus,即是为了实作整合测试用的平台而诞生的Cactus基本上也是延伸JUnit平台而发展出来的,因此它除了原有基本的method之外,还提供了可以用来模拟浏览器的内部行为的beingxxx和endxxx的methodo这两个method来这些method的执行顺序和与Web Container互动的行为模式,如图四所示我们利用beginxxx来设定要传递给受测对象的字符串参数执行完beginxxx后,会发出request将参数名称与参数值传递到Web ContaineroTestCase会执行setUp,将受测对象所需要的对象环境建立起来,接着在testxxx执行存取受测对象的动作当存取受测对象的动作执行完后,便可以检验受测对象可能存放在session的产出物然后在Web Container会执行释放资源的动作,然后将response回传到Client端最后在Client端执行endxxx来进行比对HTML code是否和预期值相同,执行完endxxx时也代表一个整合测试的结束将这五个method所执行的功能汇整如表一所示虽然Cactus架构提供了受测对象产出物与预期结果的比对功能,但是当回传的HTML code的内容过于庞大复杂时,反而不利于比对的工作因此采用了一个实用性的做法此做法是在JSP或servlet欲产出的HTML code的程序代码里,于关键的卷标内添加ID这种属性当endxxx要进行比对前,先读取记载着ID属性值与预期值的外部数据文件,再透过DOM的存取机制来取得HTML code,便能够快速地比对关键的数据不仅可以将比对的工作模块化,更能够在不需要重新编译测试码的情形下,随时变更预期值读者们若有遇到相似的问题时,不妨可以采用与相同的策略来解决整合测试不同于单元测试,虽然减低了撰写测试码的困难度,但也因为Domain Object与J2EE Container的结合,而不能为Domain Object提供单纯的测试环境因此若有其它的测试可以单纯地检验整个系统,便可以弥补整合测试的不足功能测试即是扮演这样的一个角色配置信息与代码实例table cellpadding二”0”width=”99%”border」”trxtd ServletRedirectororg.apache.cactus.server.ServletTestRedirector paramlvalue1used fortesting ServletTestRunnerorg.apache.cactus.server.runner.ServletTestRunner ServletRedirector/ServletRedirector ServletTestRunner/ServletTestRunner实例testcase:import junit.framework.Test;import junit.framework.TestSuite;import org.apache.cactus.ServletTestCase;import org.apache.caclus.WebRequest;public classTestSampleServlet extendsServletTestCase{public TestSampleServlctStringthcNamcsupertheName;public staticTest suitereturn newTestSuiteTestSampleServlet.class;public voidbeginSaveToSessionOKWebRequest webRequest{webRequest.addParametertestparam n,it works!;public voidtestSaveToSessionOKSampleServIet servlet=new SampleServlet;servlet.saveToSessionrequest;assertEquals nit works!,session.getAttribiite ntestAttribute n;}}/td/tr/table3业务逻辑测试与StrutsTestcase应用struts的使用越来越广泛,但是并没有合适测试框架与之对应.cactus,httpunit虽然都可以测试jsp,servlet,但基于struts框架的应用程序的测试依然比较麻烦不过,StrutsTestCase的出现多少解决了些问题,下面主要讲讲StrutsTestCase的应用和其他的JSP/SERVLET测试框架一样,StrutsTestcase也有两种测试结构,一种是Mock结构,另一种是利用Cactus的结构因为StrutsTestCase也是基于junit上开发的,所以它的使用方法也类似于junit.可以参考他的例子和api.可惜的是StrutsTestcase例子里没有使用ant,因此它的运行较让人头痛,特别是有关配置文件的处理StrutsTestCase在运行时必须能够找到struts-config.xml和web.xml文件,默认的位置是web-inf/目录下,所以web-inf目录要存在于classpath或者在运行的时候指定例如我的位于d:/struts-test/卜,struts-config.xml和web.xml位于d:/struts-test/webapp/WEB-INF/F,那么在运行测试的时候应当把d:/struts-test/webapp路径放到classpath里如果我的struts-config.xml不在/web-inf目录里,而是在/web-inf/conf/目录下,那么就须调用setConfigFileString path方法,按照刚才的情况,table cellpadding=”0width=99%n border=0trxtdpublic voidtestSuccessfulLoginsetRequestPathInfo71ogin;addRequestParameter”usemame”,deryl”;addRequestParameter password,radar;actionPerform;verifyForwardsuccess;},,public voidtestFailcdLoginaddRequestParameterusername Vderyl;addRequestParameterpassword,express1;setRequestPathInfo/login;actionPerform;verifyForwarcl nlogin;public voidsetUp throwsException{super.setUp;setConfigFile7WEB-INF/conf/struts-config.xml;/td/tr/table4功能测试的观念与HttpUnit应用以UML的术语来说,功能测试的对象是检验Use Case所规范的行为,测试系统是否符合所需要的功能,是否能达到使用者的需求?而单元测试的对象是检验对象Classes Diagram与Sequence Diagram所描述的关系与行为,测试单元是否执行正确,是否符合程序逻辑?每当完成一个阶段性的功能测试,也代表着完成了一部分的系统实作Open Source社群的HttpUnit API套件,即是为了功能测试而发展出来的HttpUnit是以Java撰写出来的虚拟浏览器,用来模拟浏览器的内部行为前一节所提到的Cactus检验HTML code的机制,也是采用HttpUnit来完成的除此之外,HttpUnit还可以结合JUnit平台撰写测试码来检验回传的网页内容是否与预期结果相符合HttpUnit平台的运作机制是建构在Http标准通讯协议之下,藉由模拟使用者浏览网站时,所发出的以对象的形式封装的request讯号,将其送至到目的网站,然后等到该网站处理完此request之后,便将同样以对象形式封装的response讯号回传给HttpUnit由于HttpUnit所接收的是标准HTTP协议的response对象,因此不论该网站是静态网页语言或是用任何的动态服务器端语言写成的,都可以透过HttpUnit来模拟网站浏览的行为并且取得标准的HTML code市面上也有提供功能测试用的预录播放软件,可以事先录下网站浏览的步骤,然后反复地播放预录好的流程,最后回报测试的数据给测试人员,供测试人员进行分析,大大节省撰写测试码的负担然而此类软件有以下的缺点
1.当网站设计的复杂度越高,浏览的分支流程越多,预录好的流程便无法作有效的模块化管理
2.预录播放软件虽然有提供记录浏览步骤的script或是XML文件,虽然这些指令码可以重复利用,然而若无法提供有效的侦错机制,一旦安插了错误的程序,反而容易造成无法预期的错误产生
3.测试人员需要重新学习专属于预录播放软件的script语言或是XML文件语法,无法从既有熟悉的程序语言来编写浏览网站的程序
4.当网站的操作接口时常为了需求而新增或是修改原有的互动设计时,必须重新录制新的浏览网站的程序,而无法重复利用HttpUnit解决了软件开发人员以上的困扰HttpUnit是一种黑箱作业形式的测试工具,因此我们只要专注如何在JUnit平台上撰写模拟浏览器行为的测试码即可HttpUnit内的method执行顺序和与Web Container互动的行为模式,如图五所示,箭头符号旁所标示的数字,代表着这些method的执行顺序当我们在setup设定好受测的网址与相关的环境后,setUp会执行向受测网址进行存取的动作当存取动作完成时,会将response回传至Client端此时可以在testxxx做HTML code和预期值比对的工作最后在Client端执行释放资源的动作,执行完tearDown时也代表一个功能测试的完成将这三个method所执行的功能汇整如表二所示虽然HttpUnit提供强大的仿真功能,但是HttpUnit本身还是存在两个缺点第一,当HttpUnit结合JUnit平台做测试时,由于HttpUnit存取HTML code的方式与HTML内部的文件结构的关联过于紧密,因此当网页版面需要变动时,也需要修改相对应的测试码对于这样的困扰,采用了与Cactus检测HTML code同样的改良策略,来达到快速比对而不用调整测试码的好处第二,在HttpUnit与JUnit平台结合做测试的情况时,由于JUnit特殊的运作机制,无法记住每一个已经浏览过的网址状态,因此当某个受测网址与其它网址的依存性强时,若要回传正确的浏览状态时,必须要用递归记忆的方式来达成例如要存取第二个网页必须记住第一个网页的状态,存取第三个网页要记住第一个和第二个网页的状态,同理存取第n个网页时需要记住第一个网页到n-1个网页,这样的做法不易将测试码模块化,如图六所示于是利用了HttpUnit本身也可以写成独立运作的程序代码的特性,写成一个浏览网站步骤的仿真器然后利用JUnit的setUp来存取受测网站的浏览状态,便可以在testxxx取得正确的网页状态来进行比对的工作,经过模块化后的HttpUnit测试架构如图七所示。