From Gossip@caterpillar

JUnit Gossip: 集成單元測試

如果您撰寫了下面這樣一個Servlet程式,並想為它進行測試:
  • LoginServlet.java
package onlyfun.caterpillar;

import javax.servlet.http.*;

public class LoginServlet extends HttpServlet {
public boolean isValidUser(HttpServletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password");

if(username == null ||
password == null ||
!username.equals("justin") ||
!password.equals("123456")) {
return false;
}
else {
return true;
}
}
}

為了要能對isValidUser()方法進行測試,需要一個HttpServletRequest物件,而 HttpServletRequest物件是由 Servlet Container 管理的,它有即定的生命週期,有其收集的資訊,您不能單純的創建一個HttpServletRequest就打算交差了事。

有幾個方法可以對isValidUser()方法進行測試,其中之一自然就是直接將LoginServlet置於 Container 之中,如此一來,isValidUser()若能進行測試,您不僅測試了方法本身,也測試了方法與 Container 所管理的資源之交互行為,我們稱這樣的測試為 「In-Container 測試」

對於In-Container測試,您不僅測試了單元的邏輯行為,也測試了單元能在 Container 中正確的運行,從測試的角度來看,這樣的測試是單元測試的一種,但範圍更廣,我們稱其為集成單元測試(Integration Unit Testing)

相較於集成單元測試,我們稱之前只使用JUnit進行的測試為「邏輯單元測試」(Logic Unit Test),In-Container測試是集成單元測試的一種,要實際執行In-Container測試,要比單純的邏輯單元測試複雜的多,您要將 Servlet 置於容器之中、編寫 web.xml、啟動容器、運行測試程式對 Servlet 進行測試等等。

Cactus 擴展了 JUnit,被設計來輔助您進行In-Container測試,它在很大部份上隱藏了非測試邏輯的交互細節,只留下與測試相關的部份等您來實現,從使用的角度來說,您使用Cactus進行測試,與您使用JUnit進行測試時沒有太大的不同。