JUnit是名聲大燥了,想必只要學過JAVA的人都知道世上有個東東叫JUnit。記得有個想學JUnit的兄弟在群上大喊:我要學JUnit,因為JUnit應用最廣,最好的單元測試工具。無法否認,JUnit是一個非常讓JAVA程度員或白盒測試人員喜愛的一個框架。但有時候應用最廣的未必就是萬能的,最好的未必就是最合適的。
JUnit也是有缺點的。想象一下,你有一個web程序,非常簡單的那種,是用servlet實現的,你希望對其中的loginUser()方法進行單元測試,代碼如下:
package com.test.servlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = -5174161414983884806L;
public boolean loginUser(HttpServletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password");
if (username == null || password == null || !username.equals("cuckoo")
|| !password.equals("123")) {
return false;
} else {
return true;
}
}
}
為了能夠測試這個方法,你需要得到一個合法的HttpServletRequest對象。但不幸的是,你不可能調用 new HttpServletRequest 來創建一個可用的請求。因為HttpServletRequest的生命周期是由容器管理的,因此你無法單獨使用JUnit為loginUser方法編寫測試類。
此時我們今天的主角就要出來了,它就是cactus,cactus是什么?仙人掌嗎?呵呵,當然不是了。仙人掌只是它翻譯過來的中文名。它如commons-dbutils,commons-beanutils等等一樣,是apache上的一個開源框架。下載地址為http://jakarta.apache.org/cactus/index.html 或是http://archive.apache.org/dist/jakarta/cactus/ 用官網是話說,cactus就是
Cactus is a simple test framework for unit testing server-side java code (Servlets, EJBs, Tag Libs, Filters, ...).
The intent of Cactus is to lower the cost of writing tests for server-side code. It uses JUnit and extends it.
即Cactus是一個基于JUnit框架的簡單測試框架,用來單元測試服務端Java代碼。Cactus框架的主要目標是能夠單元測試服務端的使用Servlet對象的Java方法httpServletRequest,HttpServletResponse,HttpSession等。Cactus的工作原理在官網上也可以找到,那有詳細的說明,以下是其中的一種:圖來自于cactus官網

Cactus provides several TestCase classes that extends the JUnit Testcase and it also provides several kind of redirectors (Servlet Redirector, JSP Redirector, ...). The diagram above is a generic diagram which serves to explain the principles. You'll find details for a specific redirector proxy in the next section. YYYTestCase = ( ServletTestCase | FilterTestCase | JspTestCase ) XXX is the name of the test case. Each YYYTestCase class contains several test cases
這是官網的簡單說明,意思是:cactus提供了幾個TestCase的類擴展了JUnit的TestCase的,同時也提供了若干種轉向器(重定向程序組件,JSP的重定向,...).上圖是一個普通的圖,這足以解釋的原則。你會發現,在未來一段特定的重定向代理細節。 YYYTestCase =(ServletTestCase | FilterTestCase | JspTestCase)XXX是測試案例的名稱。每個YYYTestCase類包含幾個測試案例。
我們將使用Cactus的ServletTestRedirector作為上圖介紹的Redirector Proxy,并使用Cactus的ServletTestRunner作為執行測試時的TestRunner,這兩個被撰寫為Servlet,所以要在web.xml中加以定義,代碼為:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!--
<description>cactus test</description>
<display-name>cactusTest</display-name>
-->
<servlet>
<servlet-name>ServletRedirector</servlet-name>
<servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class>
</servlet>
<servlet>
<servlet-name>ServletTestRunner</servlet-name>
<servlet-class>org.apache.cactus.server.runner.ServletTestRunner</servlet-class>
</servlet>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.test.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletRedirector</servlet-name>
<url-pattern>/ServletRedirector</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletTestRunner</servlet-name>
<url-pattern>/ServletTestRunner</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/servlet/LoginServlet</url-pattern>
</servlet-mapping>
</web-app>