Cactus是一套簡(jiǎn)單,易于使用的服務(wù)器端測(cè)試框架,可以使開發(fā)人員很輕松的測(cè)試服務(wù)器端的程序。
Cactus是Junit的一個(gè)擴(kuò)展,但是它又和Junit有一些不同。Cactus的測(cè)試分為三種不同的測(cè)試類別,jspTestCase,ServletTestCase,FilterTestCase,而不是像Junit就一種TestCase。
Cactus的測(cè)試代碼有服務(wù)器端和客戶端兩個(gè)部分,他們協(xié)同工作。在測(cè)試服務(wù)器端的應(yīng)用時(shí),Cactus和Junit相比有什么優(yōu)勢(shì)呢?
一般EJB或者servlet,jsp都是運(yùn)行在服務(wù)器上,假如你使用junit測(cè)試的話,你的測(cè)試是在客戶端,這使的運(yùn)行環(huán)境和測(cè)試環(huán)境處于不同的系統(tǒng)環(huán)境中,這個(gè)有時(shí)候會(huì)不同的測(cè)試結(jié)果。
EJB2.0中的Local interface ,不答應(yīng)遠(yuǎn)程調(diào)用。用Junit不好測(cè)試,而Cactus的reDirector位于服務(wù)器端,可以和EJB運(yùn)行在一個(gè)容器中,這使得它可以直接訪問Local Interface。
在一個(gè)EJB的應(yīng)用中,一般都會(huì)有一些前端應(yīng)用來(lái)訪問EJB,例如:jsp,servlet,javabean。這就意味著你需要一個(gè)測(cè)試框架來(lái)測(cè)試這些前端的組件。Cactus提供了所有這些組件的測(cè)試方法。
Cactus和ant很好的結(jié)合在一起,可以很輕易的完成自動(dòng)化測(cè)試,減少了很多工作量。
一、工作原理
1、JUnit Test Runner調(diào)用YYYTestCase.runTest(),這個(gè)方法尋找beginXXX(ServletTestRequest )
2、YYYTestCase.runTest()打開一個(gè)到Redirector PRoxy的HTTP連接
3、Redirector Proxy進(jìn)行如下操作
創(chuàng)建Test class的實(shí)例
創(chuàng)建一些Server對(duì)象(HttpServletRequest、ServletConfig、ServletContext)的Cactus wrapper假如需要,創(chuàng)建一個(gè)HTTP session
4、Redirector
Proxy通過Reflection,執(zhí)行Test類的setUP()、testXXX()、tearDown()
5、testXXX()調(diào)用Server side classes的方法,并通過JUnit的assert API來(lái)驗(yàn)證測(cè)試結(jié)果
6、假如測(cè)試失敗,testXXX()方法拋出例外,Redirector Proxy會(huì)捕捉例外
7、Redirector Proxy向客戶端返回例外的有關(guān)信息,JUnit會(huì)將這些信息打印出來(lái)
8、假如沒有發(fā)生例外,YYYTestCase.runTest()尋找并執(zhí)行endXXX(HttpURLConnection),在這兒你可以使用JUnit asserts檢查返回的HTTP Header、servlet output stream
Servlet Redirector Proxy
客戶端打開2個(gè)HTTP連接,一個(gè)用于執(zhí)行測(cè)試并取回Servlet輸出流;另一個(gè)取回測(cè)試結(jié)果。測(cè)試結(jié)果被存儲(chǔ)在一個(gè)變量中,并被放置到ServletContext供第二個(gè)連接取回。
JSP Redirector Proxy
客戶端打開2個(gè)連接,一個(gè)用于連接JSP Redirector執(zhí)行test,取回JSP輸出流;第二個(gè)連接Servlet Redirector取回test結(jié)果。測(cè)試結(jié)果同樣被存儲(chǔ)在一個(gè)變量中,并被放置到ServletContext供第二個(gè)連接取回。
二、配置
client端
cactus.properties
配置Server端轉(zhuǎn)向器的地址
cactus.servletRedirectorURL =
http://localhost:8080/test/ServletRedirector/
(注重:結(jié)尾為“/”)
cactus.jspRedirectorURL =
http://localhost:8080/test/JspRedirector/
cactus.filterRedirectorURL =
http://localhost:8080/test/FilterRedirector/
<web-app>
<filter>
<filter-name>FilterRedirector</filter-name>
<filter-class>org.apache.cactus.server.
FilterRedirector</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterRedirector</filter-name>
<url-pattern>/FilterRecirector/</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>JspRedirector</servlet-name>
<jsp-file>...(/someDir)/jspRedirector.jsp</jsp-file>
<init-param>
<param-name>...</param-name>
<param-value>...</param-value>
</init-param>
</servlet>
<%@page import="org.apache.cactus.server.*" session="false"
%>
<%
JspImplicitObjects objects =
new JspImplicitObjects();
objects.setHttpServletRequest(request);
objects.setHttpServletResponse(response);
objects.setServletConfig(config);
objects.setServletContext(application);
objects.setJspWriter(out);
objects.setPageContext(pageContext);
JspTestRedirector redirector =
new JspTestRedirector();
redirector.doGet(objects);
%>
import org.apache.cactsu.*;
import junit.framework.*;
public class TestSampleServlet
extends Servlet/Jsp/FilterTestCase
{
TestSampleServlet (String theName)
{
super(theName);
}
// theName就是Test的Name
main(String[])
//啟動(dòng)一個(gè)JUnit Test Runner
junit.ui.TestRunner.main(new String[]
{
TestSampleServlet.class.getName()
});
suite()
//靜態(tài)方法,返回值為Test
return new TestSuite(TestSampleServlet.class)
public void testXXX()
{
SampleServlet servlet = new SampleServlet();
session.setAttribute(“name”,”value”);
servlet.doSomething(request);
assertEquals(“something”,result);
assertEquals(“otherValue”,
session.getAttribute(“otherName”));
}
beginXXX(WebRequest) //可選
setMethod(String)
setAutomaticSession(boolean)
setURL(...)
addParameter(String,String)
endXXX(HttpURLConnection) //可選
request C org.apache.cactus.
server.HttpServletRequestWrapper
response C javax.servlet.
http.HttpServletResponse
config C org.apache.cactus.
server.ServletConfigWrapper
setServletName(String)
setInitParameter(String,String)
// 與在web.xml中設(shè)定有同樣的效果
public void testXXX()
{
MyServletToTest servlet =
new MyServletToTest();
servlet.init(config);
…servlet.someMethodToTest();
}
request C org.apache.cactus.
server.HttpServletRequestWrapper
response C javax.
servlet.http.HttpServletResponse
config C org.apache.
cactus.server.ServletConfigWrapper
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注