동작 방식

UML 시퀀스 다이어그램을 보시려면 여기를 클릭 하십시오.

Cactus Architecture
캑터스는 JUnit 테스트케이스를 확장한 여러개의 테스트케이스 및 리다이렉터 (서블릿 리다이렉터(Servlet Redirector), JSP 리다이렉터, ...)들을 제공합니다. 위의 다이어그램은 원리들을 설명하는데 사용될 포괄적인 다이어그램 입니다. 다음 섹션에서 특유의 리다이렉터 프록시(redirector proxy)에 대한 설명을 찾으실 수 있습니다.
YYYTestCase = ( 서블릿 테스트케이스(ServletTestCase) | 필터 테스트케이스(FilterTestCase) | JSP 테스트케이스(JspTestCase) )
XXX 는 테스트 케이스의 이름입니다. 각 YYYYTestCase 클래스는 여러개의 테스트케이스들을 포함하고 있습니다.

그럼 동작 방식을 이해하기 위해 여러 단계들을 통과해 봅시다. 여러분의 테스트 케이스 클래스 (YYYYTestCase에서 파생된)의 각 textXXX() 메서드에서는 다음과 같은 일이 일어납니다 :

  1. JUnit 테스트 러너가(Test Runner) YYYYTestCase.runTest() 메서드를 호출합니다. 이 메서드는 begin(WebRequest)메서드를 찾고, 있다면 실행시킵니다. 주지하실 점은 이 메서드는 매 테스트 전에 호출된다는 것입니다. beginXXX()로 전달되는 WebRequest 파라미터는 HTTP 헤더들, HTTP 파라미터들 의 설정에 사용되고, 2번째 단계에서 리다이렉터 프록시(redirector proxy)로 보내집니다. runTest() 메서드는 beginXXX(WebRequest) 메서드를 찾고, 찾았다면 그 메서드를 실행합니다.
  2. 다음으로 YYYTestCase.runTest()는 리다이렉터 프록시(redirector proxy)와의 HTTP 연결을 생성합니다. beginXXX() 메서드에서 설정된 모든 파라미터들은 HTTP 요청(HTTP headers, HTTP parameters, ...)으로 전송됩니다.
  3. 리다이렉터 프록시(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)하여 리다이렉터를 채웁니다.
  4. 여러분의 클래스에 있는 setUp(), testXXX()tearDown() 메서드들을 실행합니다(순서대로). 그 메서드들은 리다이렉터 프록시(redirector proxy)가 리플렉션을 이용하여 호출합니다. 물론 setUp()tearDown() 은 선택적입니다(JUnit 과 같습니다).
  5. 여러분의 testXXX() 메서드는 테스트를 위해 여러분의 서버측 코드들을 호출하고 호출하고 , 테스트를 실행하며 JUnit 단언(assert) API 를 사용하여 결과를 결정합니다.
  6. 만약 테스트가 실패하면, 여러분의 testXXX() 메서드들은 리다이렉터 프록시 (Redirector proxy)에게 예외를 던지게 됩니다.
  7. 만약 예외가 발생하면, 리다이렉터 프록시(Redirector proxy)는 클라이언트측에 해당 예외에 대한 정보(이름, 클래스, 스택 트레이스(stack trace))를 돌려줍니다. 예외에 대한 정보는 테스트 러너 콘솔(Test Runner console)에 JUnit 이 출력해 줍니다.
  8. 예외가 발생하지 않으면 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)

Servlet Redirector Architecture

클라이언트 측에서는 서블릿 리다이렉터에 2개의 HTTP 연결을 생성합니다.한번 테스트를 실행하고 서블릿이 출력 스트림을 만들면, 다음번에 그 테스트 결과를 가져옵니다. 이것은 만약 테스트가 실패했을 경우 예외 데이터(메시지, 스택트레이스,...) 를 가져올 수 있게 해줍니다. 테스트 결과는 ServletContext 에 저장되는 변수에 기록되고 두번째 HTTP 연결시 가져옵니다.

JSP 리다이렉터 프록시(JSP Redirector Proxy)

JSP Redirector Architecture

클라이언트 측에서는 JSP 리다이렉터에 2개의 HTTP 연결을 생성합니다. 한번 테스트를 실행하고 서블릿이 출력 스트림을 만들면, 다음번에 그 테스트 결과를 가져옵니다. 이것은 만약 테스트가 실패했을 경우 예외 데이터(메시지, 스택트레이스,...) 를 가져올 수 있게 해줍니다. 테스트 결과는 ServletContext 에 저장되는 변수에 기록되고 두번째 HTTP 연결시 가져옵니다.

필터 리다이렉터 프록시(Filter Redirector Proxy)

Filter Redirector Architecture

클라이언트 측에서는 필터 리다이렉터에 2개의 HTTP 연결을 생성합니다. 한번 테스트를 실행하고 서블릿이 출력 스트림을 만들면, 다음번에 그 테스트 결과를 가져옵니다. 이것은 만약 테스트가 실패했을 경우 예외 데이터(메시지, 스택트레이스,...) 를 가져올 수 있게 해줍니다. 테스트 결과는 ServletContext 에 저장되는 변수에 기록되고 두번째 HTTP 연결시 가져옵니다.