From Gossip@caterpillar

JUnit Gossip: 簡介 Cactus

Cactus協助您進行 In-Container 測試,其基本原理即讓Container實際建立相關的物件,例如HttpServletRequest、HttpServletResponse等等, Cactus為您保留這些物件,讓您可以指定給所要測試的單元方法,這些物件實際上仍由Container管理,所以您的Servlet等所測試的單元方 法,會接近於真正運行於Container之中。

來看看Cactus在進行測試時的運作流程:

Cactus運作

您會繼承XXXTestCase來撰寫您的測試案例,例如為Servlet作測試時,您會繼承ServletTestCase,在當中您可以定義 beginXXX()、setUp()、testXXX()、tearDown()、endXXX()等方法。
  1. 當一個單元測試開始時,TestRunner會產生TestCase實例,執行beginXXX()方法,在這個方法中您可以準備一些HTTP相關的參數,例如加入使用者名稱、密碼等參數。
  2. TestRunner使用HTTP與伺服器上的Redirector Proxy進行溝通,Redirector Proxy會接收請求並產生相關的物件,像是HttpServletRequest、HttpServletResponse等等,並將這些物件保留下來。
  3. Redirector Proxy會再產生TestCase實例,並開始執行上面的setUp()、testXXX()、tearDown()等方法,這部份與單純的JUnit 是相同的,而不同的是,之前Redirector Proxy所保留的HttpServletRequest、HttpServletResponse等等可以在這個時候使用了。
  4. HttpServletRequest、HttpServletResponse等等實例現在開始指定給被測試的類別上之方法,方法傳回結果,完成斷言等測試。
  5. Redirector Proxy收集測試結果。
  6. Redirector Proxy將測試結果以HTTP傳回給TestRunner。
  7. TestRunner執行endXXX()方法,您可以在這邊分析HTTP傳回的訊息,並顯示測試結果。

由上面大致的流程說明中可以明瞭,Cactus會產生兩個TestCase實例,一個在客戶端,一個在伺服端,客戶端的TestCase準備HTTP相關 訊息,分析傳回的訊息,收集測試結果並顯示之,伺服端的TestCase對Servlet進行實際測試,其運行流程就類似於單純的JUnit測試。

為了要與真實的Container資源進行互動,由Redirector Proxy接收客戶端請求,實際產生相關的資源。

雖然實際的測試流程如上介紹的有些繁瑣,但是實際上使用Cactus時是很簡單的,Cactus將大部份的細節都隱藏了起來,畢竟測試本身已經不容易,測試框架不能讓事情變得更為複雜。