Java application 이 아니고 web servlet 을 테스트 하고 싶을 때 Servlet Test Case 위자드를
사용하여 파일을 생성해서 테스트 해볼수 있다.
보는 바와같이 상속받는 TestCase 클래스가 ServletTestCase 로 바뀌었다.
그리고 선택 옵션들이 많아졌다.
위자드로 자동 생성된 소스이다.
public class JunitServletTest extends ServletTestCase {
public JunitServletTest(String arg0) {
super(arg0);
}
protected void setUp() throws Exception {
super.setUp();
}
public void testMain(){
}
public void begin(WebRequest request) throws Exception {
}
public void end(WebRequest request) throws Exception {
}
}
아래소스는 상속받은 ServletTestCase 클래스의 내용이다. Servlet 테스트를 하기위해 필요한
httpServletResponse 등과 같은 http관련 클래스 변수가 아래에 보일것이다.
public class ServletTestCase extends AbstractCactusTestCase
implements CactusTestCase
{
public ServletTestCase()
{
}
public ServletTestCase(String theName)
{
super(theName);
}
public ServletTestCase(String theName, Test theTest)
{
super(theName, theTest);
}
protected ProtocolHandler createProtocolHandler()
{
return new HttpProtocolHandler(new DefaultServletConfiguration());
}
public HttpServletRequestWrapper request;
public HttpServletResponse response;
public HttpSession session;
public ServletConfigWrapper config;
}
이와 관련된 로직을 이해하기 위해서는 Cactus 작동원리를 알아야한다.
그림을 설명하자면 먼저 브라우저에서 URL 로 TestCase 를 호출하게 되면
Junit Test Runner 는 YYYTestCase 의 runTest() 메서드를 호출하게 된다.
그 메서드는 begin(), beginXXX() 차례로 수행하면서 beginXXX 에 전달된
WebRequest 매개변수를 이용해서 HTTP 관련변수를 셋팅한다.
다음은 Redirector Proxy 에 HTTP 연결을 확립하여 설정된 헤더 및 매개변수를 전달한다.
Redirector Proxy 는 이름 그대로 대리자 역할을 하는데 Client 에 생성했던것과 같은
Junit Test Runner 을 서버측에서 다시 한번 인스턴스를 생성한다. 서버측은 클라이언트와 달리
setUp, testXXX, tearDown 으로 실행된다.
testXXX 메서드는 Junit 의 assert API 를 사용하여 테스트를 수행하고 서버측 서블릿코드를
호출하게 된다. 그리고 서버객체에 대한 레퍼(Wrappers) 와 HTTP세션을 생성한다.
Exception 이 발생하게 되면 Redirector Proxy 에 의해 검출되며 클라이언트 측에 전달하여
Junit 에 의해 화면에 출력된다.
정상수행일 경우 YYYTestCase.runTest() 메소드는 endXXX, end 를 차례대로 호출한다.
서블릿 테스트 코드를 만들면 다음과 같이 간단하게 만들었다.
호출할 Servlet 서버소스 이다.
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException{
PrintWriter out = res.getWriter();
HttpSession session = req.getSession();
String id = req.getParameter("id");
String passwd = req.getParameter("passwd");
if (checkLogin(id, passwd)){
session.setAttribute("id", id);
out.print(id+"Login Failed");
}else{
out.print(id+"Login Success");
}
}
private boolean checkLogin(String id, String passwd){
return true;
}
}
다음은 TestCase 클래스이다.
import javax.servlet.ServletException;
import org.apache.cactus.ServletTestCase;
import org.apache.cactus.WebRequest;
import com.meterware.httpunit.WebResponse;
public class JunitServletTest extends ServletTestCase {
public JunitServletTest(String arg0) {
super(arg0);
}
protected void setUp() throws Exception {
super.setUp();
}
public void testMain(){
LoginServlet servlet = new LoginServlet();
try {
servlet.init(config);
servlet.doGet(request, response);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
assertEquals("bcho", session.getAttribute("id"));
}
public void begin(WebRequest request) throws Exception {
}
public void beginLogin(WebRequest request) throws Exception {
request.addParameter("id", "bcho");
request.addParameter("passwd", "passwd");
}
public void endLogin(WebResponse response) throws Exception {
String responseTxt = response.getText();
assertTrue(responseTxt.indexOf("success") > 0);
}
public void end(WebResponse response) throws Exception {
}
}
http://www.dude.co.kr
댓글 없음:
댓글 쓰기