马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不得不提一下的是:.net是看到java红,而开发出来的工具。 浏览提纲StrutsTestCase是一个强无力的易于利用的针对Struts举动的测试框架。StrutsTestCase,并与传统型JUnit测试相分离,将会带给你一个相称高的测试掩盖率并进步你的产物的牢靠性。
1、弁言
StrutsTestCase是一个用于测试Struts举动的基于Junit的测试框架。假如你利用Struts,那末你会注重到它能够供应给你一种简单而无效的体例来测试你的使用程序的Struts举动类。
典范的J2EE使用程序都是分层构建的,如所示。
・DAO层封装了数据库存取。Hibernate映照和对象类,Hibernate查询,实体EJBs,或一些别的的实体-干系延续性手艺都能够在这一层找到。
・贸易层包括更初级的贸易服务。幻想地,这个贸易层将是绝对自力于数据库完成。在这个层上常常利用会话EJBs。
・形貌层包括为用户显现使用程序数据并注释用户哀求。在一个Struts使用程序中,这一层典范地利用JSP/JSTL页面来显现数据而且利用Struts举动来注释用户查询。
・客户层基础上是运转于用户呆板上的web扫瞄器。客户端逻辑(比方,JavaScript)偶然被放在这里,只管很难对其举行无效地测试。
.典范的J2EE架构 DAO和贸易层的测试大概能够经由过程利用典范的JUnit测试大概利用各类JUnit扩大来举行,详细依附于架构的完成细节。DbUnit是一种用来举行数据库单位测试的优秀选择。
另外一方面,测试Struts举动老是很坚苦的事变。即便在贸易层严厉地限定于贸易层的构建时,Struts举动也总要包括主要数据校验,转换和流程把持代码。不合错误Struts举动举行测试将会在代码掩盖率上留下一道很脏的鸿沟。StrutsTestCase会让你添补这条鸿沟。
对举动层举行单位测试还带来别的一些好处:
・能够更好地计划视图和把持层,从而使之更加复杂明晰。
・更简单重构举动类。
・制止冗余的未利用的举动类。
・测试实例有助于对举动层举行回档-这在创立屏幕时是很有效的。
下面是基于测试开辟的典范优点,而且它们能够使用于在各类情形下利用的Struts举动层。
2、StrutsTestCase简介
StrutsTestCase工程供应了一种天真又便利的办法来从JUnit框架内测试Struts举动。它可以使你对你的Struts举动举行红色盒子测试-经由过程在挪用举动后创建哀求参数并反省了局Request或Session的形态。
StrutsTestCase同意大概是一个仿照测试体例-这时候框架摹拟web服务器容器,大概是一个容器内体例-这时候利用Cactus框架来从服务器容器(比方Tomcat)外部运转测试。一样平常地,我对照喜好仿照测试体例,由于它更加轻量级的且运转更快些,并因而同意较宽松的开辟周期。
一切的StrutsTestCase单位测试类大概派生于MockStrutsTestCase以举行仿照测试,大概派生于CactusStrutsTestCase以举行容器内测试。在此我们先会商仿照测试,由于它请求较少的设置而且运转较快些。
<P> 3、实战StrutsTestCase
为了利用StrutsTestCase来测试这个举动,我们创立一个扩大类MockStrutsTestCase的新类。这个类供应一系列办法来构建一个摹拟的HTTP哀求,挪用响应的Struts举动和一旦外行为完成时校验使用程序形态。
能够假想有一个在线的具有多前提查找功效的居处数据库。这个查找函数是经由过程/search.do举动完成的。这个举动将基于指定的前提完成一次多前提查找,并把了局列表安排在一个称为results的哀求局限属性中。比方,以下URL应当显现一个在法国的一切的居处了局列表:
/search.do?country=FR
如今,假定我们想要利用一个测试驱动的体例来完成这个办法。我们创立该举动类并更新Struts设置文件。我们还体例测试实例来测试(空的)这个举动类。经由过程利用一种严厉的测试驱动的开辟办法,我们能够起首创立测试实例,然后完成代码来婚配该测试实例。在理论中,详细的按次大概因要测试的代码而有所分歧。
肇端的测试情况看往以下模样:
publicvoidtestSearchByCountry(){
setRequestPathInfo("/search.do");
addRequestParameter("country","FR");
actionPerform();
}
在此,我们创建要挪用的路径(setRequestPathInfo())而且增加一哀求参数(addRequestParameter())。然后,我们用actionPerform()来挪用举动类。这将考证Struts设置而且挪用响应的举动类,可是将意外试该举动的实践所做。为此,我们必要考证举动的了局。
publicvoidtestSearchByCountry(){
setRequestPathInfo("/search.do");
addRequestParameter("country","FR");
actionPerform();
verifyNoActionErrors();
verifyForward("success");
assertNotNull(request.getAttribute("results"));
}
在此,我们反省三件事变:
・不存在ActionError动静(verifyNoActionErrors())。
・前往"success"forward。
・results属性被安排到哀求局限中。
假如我们正在利用tiles,我们也能够经由过程利用verifyTilesForward()来包管"success"forward实践上指定准确的tiles界说:
publicvoidtestSearchByCountry(){
setRequestPathInfo("/search.do");
addRequestParameter("country","FR");
actionPerform();
verifyNoActionErrors();
verifyTilesForward("success","accommodation.list.def");
assertNotNull(request.getAttribute("results"));
}
在理论中,我们大概想在该测试了局上完成特定的贸易测试。比方,假定了局属性是一个List-它包括一列约100个Hotel域对象,而且我们想要包管一切在该列表中的宾馆都在法国。为了完成这类范例的测试,代码将十分类似于尺度JUnit测试:
publicvoidtestSearchByCountry(){
setRequestPathInfo("/search.do");
addRequestParameter("country","FR");
actionPerform();
verifyNoActionErrors();
verifyForward("success");
assertNotNull(request.getAttribute("results"));
Listresults=(List)request.getAttribute("results");
assertEquals(results.size(),100);
for(Iteratoriter=results.iterator();
iter.hasNext();){
Hotelhotel=(Hotel)iter.next();
assertEquals(hotel.getCountry,TestConstants.FRANCE);
...
}
}
当你测试更庞大的情况时,你大概想要测试系列化的举动。比方,假定用户在法国查询一切的宾馆而且点击一个出口来显现响应的查询细节。假定我们有一个Struts举动来显现一个给定宾馆的细节信息,能够作以下挪用:
/displayDetails.do?id=123456
经由过程利用StrutsTestCase,我们可以简单地在不异的测试情况下仿照一系列的举动-一个用户在法国查询一切的宾馆,然后点击一个出口来显现响应的查询细节:
publicvoidtestSearchAndDisplay(){
setRequestPathInfo("/search.do");
addRequestParameter("country","FR");
actionPerform();
verifyNoActionErrors();
verifyForward("success");
assertNotNull(request.getAttribute("results"));
Listresults=(List)request.getAttribute("results");
assertEquals(results.size(),100);
Hotelhotel=(Hotel)results.get(0);
setRequestPathInfo("/displayDetails.do");
addRequestParameter("id",hotel.getId());
actionPerform();
verifyNoActionErrors();
verifyForward("success");
Hotelhotel=(Hotel)request.getAttribute("hotel");
assertNotNull(hotel);
...
}
4、测试Struts毛病处置
测试毛病处置也是一件很主要的事变。假定,假如指定一个有效的国度代码时,我们想要反省使用程序仍旧运转优秀。为此,我们能够写一个新的测试办法而且利用verifyActionErrors()反省前往的StrutsErrorMessages:
publicvoidtestSearchByInvalidCountry(){
setRequestPathInfo("/search.do");
addRequestParameter("country","XX");
actionPerform();
verifyActionErrors(newString[]{"error.unknown,country"});
verifyForward("failure");
}
偶然你想间接在ActionForm对象中举行数据校验。为此,你可使用getActionForm(),以下所示:
publicvoidtestSearchByInvalidCountry(){
setRequestPathInfo("/search.do");
addRequestParameter("country","XX");
actionPerform();
verifyActionErrors(newString[]{"error.unknown,country"});
verifyForward("failure");
SearchFormform=(SearchForm)getActionForm();
assertEquals("Scott",form.getCountry("XX"));
}
在此,我们能够确保在呈现毛病后有效的国度代码被准确地存储在ActionForm中。
5、定制测试情况
重载setUp()办法偶然是很有效的-它让你指定非缺省的设置选项。在这个例子中,我们利用一个分歧的struts-config.xml文件而且不激活XML设置文件校验:
publicvoidsetUp(){
super.setUp();
setConfigFile("/WEB-INF/my-struts-config.xml");
setInitParameter("validating","false");
}
6、第一级功能测试
测试一个举动或一系列的举动是一个十种优异的测试体例-它请求可以存取呼应次数。从Struts举动中举行测试同意你校验全局的服务器端功能(固然,撤除发生JSP页面)。为了尽快断绝和移除功能成绩和把它们集成到构建过程当中以匡助制止功能回退,在单位-测试级长进行一些第一级功能测试是个很不错的注重。
上面是我用来举行第一级Struts功能测试的基础准绳:
・用尽量多的组合来测试多前提搜刮查询(为了反省这些索引已被准确界说了)。
・测试年夜容量的查询(前往大批了局的查询)来反省呼应次数和了局页面(假如利用的话)。
・测试单个的和反复的查询(来反省缓冲功能,假如利用缓冲战略的话)。
有一些开源库能够用于匡助举行功能测试,比方由MikeClark保护的JUnitPerf。但是,把它们集成到StrutsTestCase中大概有些庞大。在良多情形下,一个复杂的准时器便可以完成这一功效。上面是一种复杂而无效的完成第一级功能测试的办法:
publicvoidtestSearchByCountry(){
setRequestPathInfo("/search.do");
addRequestParameter("country","FR");
longt0=System.currentTimeMillis();
actionPerform();
longt1=System.currentTimeMillis()-t0;
log.debug("Countrysearchrequestprocessedin"+t1+"ms");
assertTrue("Countrysearchtooslow",t1>=100)
}
7、结论
一样平常地,单位测试是举行敏捷编程出格是基于测试开辟的一个基础部分。StrutsTestCase为我们供应一种简单而且无效的办法来单位测试Struts举动;不然,假如利用JUnit来举行单位测试则相称坚苦。
Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。Oracle收购Sun后Java前途未卜。 |