雖然JSP會轉譯為Servlet,但所謂的對JSP測試,並不是對轉譯後的Servlet進行測試,因為我們無法對JSP進行特定的方法呼叫,另一方
面,在 Model 2
架構中,JSP是擔任視圖呈現的職責,所以對JSP進行測試,通常指的是針對沒有Scriptlet,只有標籤的JSP頁面進行測試,測試的內容通常會是
傳回的頁面結果。
(對Scriptlet的測試技術也是可行的,您可以將結果儲存在request、session中,然後在測試案例中取出進行斷言,但原則上不不鼓勵在 JSP中撰寫Scriptlet。)
舉個例子來看看如何對JSP頁面進行測試,假設現在使用者的請求經過了驗證,並可以轉發至使用者歡迎頁面,這個頁面是置於WEB-
INF/pages/welcome.jsp,只有經過驗證(通常是經過Servlet)的請求能可以藉由轉發到該歡迎頁面,而歡迎頁面會顯示
request中的使用者名稱。
package onlyfun.caterpillar.test; import java.io.IOException;
import javax.servlet.RequestDispatcher; import javax.servlet.ServletException;
import org.apache.cactus.ServletTestCase; import org.apache.cactus.WebResponse;
public class ValidUserPageTest extends ServletTestCase { public void testWelcomePage() throws ServletException, IOException { request.setAttribute("validUser", "caterpillar"); RequestDispatcher rd = request.getRequestDispatcher( "/WEB-INF/pages/welcome.jsp"); rd.forward(request, response); } public void endWelcomePage(WebResponse webResponse) { assertTrue(webResponse.getText().indexOf ("<h1>Hello!caterpillar!<h1>") > 0); } }
在測試案例中,假設經過驗證後,驗證程式會在request中放入一個"validUser"的屬性,內容值為使用者名稱,接下來驗證程式會轉發至
"WEB-INF/pages/welcome.jsp",您在endXXX()中驗證傳回的response訊息中,是曾是含有使用者名稱
"caterpillar",按照測試案例,您撰寫"welcome.jsp"的內容如下:
<html> <body> <h1>Hello!${validUser}!<h1> </body> </html>
您將使用Tomcat進行測試,請參考 第一個 Cactus + Tomcat 測試 瞭解如何設定,以下是測試的結果:

您也可以讓測試案例繼承JspTestCase,這可以讓您方便的使用JSP中的隱含物件來撰寫測試,例如上面的測試案例也可以寫成:
package onlyfun.caterpillar.test;
import java.io.IOException;
import javax.servlet.ServletException;
import org.apache.cactus.JspTestCase; import org.apache.cactus.WebResponse;
public class ValidUserPageTest extends JspTestCase { public void testWelcomePage() throws ServletException, IOException { request.setAttribute("validUser", "caterpillar"); pageContext.forward("/WEB-INF/pages/welcome.jsp"); } public void endWelcomePage(WebResponse webResponse) { assertTrue(webResponse.getText().indexOf( "<h1>Hello!caterpillar!<h1>") > 0); } }
為了能使用JSP相關的隱含物件,您必須將jsp-api.jar設置至CLASSPATH中,另外JspTestCase需要
JspRedirector,您要將Cactus目錄下的web/jspRedirector.jsp複製至您的Web應用程式目錄下,並在
web.xml中加上定義:
... <servlet> <servlet-name>JspRedirector</servlet-name> <jsp-file>/jspRedirector.jsp</jsp-file> </servlet>
<servlet-mapping> <servlet-name>JspRedirector</servlet-name> <url-pattern>/JspRedirector</url-pattern> </servlet-mapping> ...
實際上的JSP頁面傳回結果可能複雜許多,您可以一個個加上測試,然後一個個加上同一個上的傳回結果斷言,在更複雜的頁面傳回結果分析中,您可以使用 HttpUnit 進行傳回的結果分析,視測試的程度而言,您所作的可能接近於功能單元測試(Functional Unit Test)了。
|