Please Enable JavaScript!
Gon[ Enable JavaScript ]

반응형


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 {

       }

}


반응형
Posted by 녹두장군1
,