JUnit 是名聲大燥了,想必只要學過 JAVA 的人都知道世上有個東東叫 JUnit 。記得有個想學 JUnit 的兄弟在群上大喊:我要學 JUnit ,因為 JUnit 應用最廣,最好的單元測試工具。無法否認, JUnit 是一個非常讓 JAVA 程度員或白盒測試人員喜愛的一個框架。但有時候應用最廣的未必就是萬能的,最好的未必就是最合適的。
JUnit 也是有缺點的。想象一下,你有一個 web 程序,非常簡單的那種,是用 servlet 實現(xiàn)的,你希望對其中的 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 來創(chuàng)建一個可用的請求。因為 HttpServletRequest 的生命周期是由容器管理的,因此你無法單獨使用 JUnit 為 loginUser 方法編寫測試類。
? ?? 此時我們今天的主角就要出來了,它就是 cactus , cactus 是什么?仙人掌嗎?呵呵,當然不是了。仙人掌只是它翻譯過來的中文名。它如 commons-dbutils , commons-beanutils 等等一樣,是 apache 上的一個開源框架。下載地址為 http://jakarta.apache.org/cactus/index.html 或是 http://archive.apache.org/dist/jakarta/cactus/ ? 用官網(wǎng)是話說, 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 的工作原理在官網(wǎng)上也可以找到,那有詳細的說明,以下是其中的一種: 圖來自于cactus官網(wǎng)
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
這是官網(wǎng)的簡單說明,意思是: cactus 提供了幾個 TestCase 的類擴展了 JUnit 的 TestCase 的,同時也提供了若干種轉向器(重定向程序組件, JSP 的重定向, ...). 上圖是一個普通的圖,這足以解釋的原則。你會發(fā)現(xiàn),在未來一段特定的重定向代理細節(jié)。 YYYTestCase = ( ServletTestCase | FilterTestCase | JspTestCase ) XXX 是測試案例的名稱。每個 YYYTestCase 類包含幾個測試案例。
我們將使用 Cactus 的 ServletTestRedirector 作為上圖介紹的 Redirector Proxy ,并使用 Cactus 的 ServletTestRunner 作為執(zhí)行測試時的 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 >
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
