2010년 8월 4일 수요일

Junit 사용법

Junit Test case, suit 는 java application 을 위해 존재하는 것들이다.
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





P 이경철님의 파란블로그에서 발행된 글입니다.

댓글 없음:

댓글 쓰기