동작 방식
UML 시퀀스 다이어그램을 보시려면 여기를 클릭 하십시오.
캑터스는 JUnit 테스트케이스를 확장한 여러개의 테스트케이스 및
리다이렉터 (서블릿 리다이렉터(Servlet Redirector), JSP 리다이렉터, ...)들을 제공합니다. 위의 다이어그램은 원리들을
설명하는데 사용될 포괄적인 다이어그램 입니다. 다음 섹션에서 특유의 리다이렉터 프록시(redirector proxy)에 대한 설명을
찾으실 수 있습니다.
YYYTestCase = ( 서블릿 테스트케이스(ServletTestCase) | 필터 테스트케이스(FilterTestCase) | JSP 테스트케이스(JspTestCase) )
XXX 는 테스트 케이스의 이름입니다. 각 YYYYTestCase 클래스는 여러개의 테스트케이스들을 포함하고
있습니다.
그럼 동작 방식을 이해하기 위해 여러 단계들을 통과해 봅시다. 여러분의 테스트 케이스 클래스
(YYYYTestCase에서 파생된)의 각 textXXX() 메서드에서는
다음과 같은 일이 일어납니다 :
-
JUnit 테스트 러너가(Test Runner)
YYYYTestCase.runTest() 메서드를 호출합니다.
이 메서드는 begin(WebRequest)메서드를 찾고, 있다면 실행시킵니다.
주지하실 점은 이 메서드는 매 테스트 전에 호출된다는 것입니다. beginXXX()로
전달되는 WebRequest 파라미터는 HTTP 헤더들, HTTP 파라미터들 의 설정에
사용되고, 2번째 단계에서 리다이렉터 프록시(redirector proxy)로 보내집니다. runTest() 메서드는
beginXXX(WebRequest) 메서드를 찾고, 찾았다면 그 메서드를 실행합니다.
-
다음으로
YYYTestCase.runTest()는 리다이렉터 프록시(redirector proxy)와의 HTTP 연결을 생성합니다.
beginXXX() 메서드에서 설정된 모든 파라미터들은 HTTP 요청(HTTP headers,
HTTP parameters, ...)으로 전송됩니다.
-
리다이렉터 프록시(redirector proxy)는 여러분의 테스트 케이스 클래스에 대해 서버측 프록시(proxy) 처럼 작동합니다.
이것은 여러분의 테스트 케이스 클래스가 두번 인스턴스화 된다는 것을 뜻합니다 : 한번은 클라이언트
측에서(Junit 테스트 러너에 의해)에서 한번, 그리고 서버 측(리다이렉터 프록시에 의해)에서 한번
생성됩니다. 클라이언트 측의 인스턴스는
begin(), beginXXX(),
endXXX() 그리고 end() 메서드(단계 1과 8을 보십시오)
를 실행하기위해 사용되고, 서버 측 인스턴스는 testXXX() 메서드(단계 4)를 실행
하기위해 사용됩니다. 리다이렉터 프록시(redirector proxy)는 다음과 같은 일을 합니다.
-
리플렉션(reflection)을 사용해 여러분의 테스트 케이스의 인스턴스를 생성합니다.
이 내장(implicit) 객체들(
YYYTestCase의 클래스 변수들인)은 리다이렉터
프록시(redirector proxy)에 의존적입니다(다음 섹션을 보십시오)
-
몇몇의 서버 객체들(
HttpServletRequest, ServletConfig,
ServletContext, ...)용 캑터스 래퍼(wrapper)들의 인스턴스를 생성합니다.
이것은 모의 값(simulated value)을 리턴할 수 있도록 메서드들을 오버라이드 하는 것을 가능케합니다
예를 들어, 캑터스 프레임웍은 URI 를 가장할 수 있습니다(예를들면 마치 이 URI가 리다이렉터 프록시 URI
대신 불린 것 처럼 동작한다 입니다). 그려므로, getServerName(),
getServerPort(), getRequestURI(), ... 메서드들은
모의 URI 에 기초한 값들을 리턴합니다(물론 사용자가 설정해 놓아야 합니다).
-
만약 사용자가 원한다고 표시한다면(
beginXXX()메서드안에서
WebRequest.setAutomaticSession(boolean) 라는 코드를 사용합니다.
기본설정은 항상 생성한다 입니다) HTTP 세션을 생성하고, session 내장(implicit) 객체를
리플렉션(reflection)하여 리다이렉터를 채웁니다.
-
여러분의 클래스에 있는
setUp(), testXXX() 및
tearDown() 메서드들을 실행합니다(순서대로). 그 메서드들은
리다이렉터 프록시(redirector proxy)가 리플렉션을 이용하여 호출합니다.
물론 setUp() 및 tearDown() 은 선택적입니다(JUnit 과 같습니다).
-
여러분의
testXXX() 메서드는 테스트를 위해 여러분의 서버측 코드들을 호출하고
호출하고 , 테스트를 실행하며 JUnit 단언(assert) API 를 사용하여 결과를 결정합니다.
-
만약 테스트가 실패하면, 여러분의
testXXX() 메서드들은 리다이렉터 프록시
(Redirector proxy)에게 예외를 던지게 됩니다.
-
만약 예외가 발생하면, 리다이렉터 프록시(Redirector proxy)는 클라이언트측에 해당
예외에 대한 정보(이름, 클래스, 스택 트레이스(stack trace))를 돌려줍니다. 예외에
대한 정보는 테스트 러너 콘솔(Test Runner console)에 JUnit 이 출력해 줍니다.
-
예외가 발생하지 않으면
YYYTestCase.runTest() 메서드는
endXXX(org.apache.cactus.WebResponse) 혹은
endXXX(com.meterware.httpunit.WebResponse) 메서드(이 시그니쳐(signature)
들은 HttpUnit 과 통합하기(integration) 에서
사용됩니다) 를 찾고, 찾았다면 그것들을 실행시킵니다. 이 부분에서, 여러분은 반환된 HTTP 헤더들,
쿠키들과 서블릿의 출력 스트림(stream)을 endXXX() 메서드에서 확인할 수 있는
기회를 갖게되고, 재차 JUnit 단언(assert)들과 캑터스에의해 제공되는 헬퍼 유틸리티 클래스들을 사용할 수
있습니다. 그 다음 runTest() 메서드는 end(org.apache.cactus.WebResponse)
혹은 end(com.meterware.httpunit.WebResponse) 메서드를 찾고, 만약 있다면
호출합니다. 이 end() 메서드는 각 테스트 후에 호출됩니다.
리다이렉터 프록시들
캑터스는 세개의 리다이렉터 프록시 구현체를 제공합니다(이 리다이렉터들을 어떻게 사용하는지에 대한 더 자세한 내용은
테스트케이스 작성하기를 보십시오):
-
서블릿 리다이렉터(Servlet Redirector). 이 리다이렉터는 서블릿 메서드들 혹은 서블릿
객체들(
HttpServletRequest, ...)을 사용하는 자바 클래스를 단위 테스트하기 위해
사용되는 서블릿 입니다.
-
JSP 리다이렉터(JSP Redirector). 이 리다이렉터는 JSP 내장(implicit) 객체에 접근하는
서버측 코드를 단위 테스팅하기위해 사용되는 JSP 페이지 입니다.
-
필터 리다이렉터(Filter Redirector). 이 리다이렉터는 서블릿 필터들이나 필터 객체들(
FilterConfig, ...)
을 사용하는 자바 클래스들을 단위 테스티하기 위한 서블릿 필터입니다.
서블릿 리다이렉터 프록시(Servlet Redirector Proxy)
클라이언트 측에서는 서블릿 리다이렉터에 2개의 HTTP 연결을 생성합니다.한번 테스트를 실행하고 서블릿이 출력
스트림을 만들면, 다음번에 그 테스트 결과를 가져옵니다. 이것은 만약 테스트가 실패했을 경우 예외 데이터(메시지,
스택트레이스,...) 를 가져올 수 있게 해줍니다. 테스트 결과는 ServletContext 에 저장되는
변수에 기록되고 두번째 HTTP 연결시 가져옵니다.
JSP 리다이렉터 프록시(JSP Redirector Proxy)
클라이언트 측에서는 JSP 리다이렉터에 2개의 HTTP 연결을 생성합니다. 한번 테스트를 실행하고 서블릿이 출력
스트림을 만들면, 다음번에 그 테스트 결과를 가져옵니다. 이것은 만약 테스트가 실패했을 경우 예외 데이터(메시지,
스택트레이스,...) 를 가져올 수 있게 해줍니다. 테스트 결과는 ServletContext 에 저장되는
변수에 기록되고 두번째 HTTP 연결시 가져옵니다.
필터 리다이렉터 프록시(Filter Redirector Proxy)
클라이언트 측에서는 필터 리다이렉터에 2개의 HTTP 연결을 생성합니다. 한번 테스트를 실행하고 서블릿이 출력
스트림을 만들면, 다음번에 그 테스트 결과를 가져옵니다. 이것은 만약 테스트가 실패했을 경우 예외 데이터(메시지,
스택트레이스,...) 를 가져올 수 있게 해줍니다. 테스트 결과는 ServletContext 에 저장되는
변수에 기록되고 두번째 HTTP 연결시 가져옵니다.
|