2011-11-07 2 views
1

현재 저는 스프링 기반 어플리케이션을 연구 중입니다. 응용 프로그램의 여러 목적을 위해 몇 가지 단위 테스트가 있습니다. 문제는 응용 프로그램에서 실제 통합 테스트를 수행 할 수있는 솔루션을 찾지 못했기 때문입니다.스프링 3 - 실제 통합 테스트

제가 예를 들어 보겠습니다 : 설정을 내가 할 특정 컨트롤러에 대한 요청을 내 현재 테스트에서

을 내 핸들러에 해당 구성 요소를 전달합니다

// setup request 
request.setMethod("GET"); 
request.setRequestURI("/customer"); 
request.addHeader("Accept", "application/json"); 
request.addHeader("Authorization", "Basic xyz"); // base_64 
handlerAdapter.handle(request, response, myController); 

그러나 이것은 진정한 통합이 아니다 테스트, 왜냐하면 내가 말하는 것은 괜찮습니다. 요청을 받았고 myController가이 요청을 처리해야합니다.

내가 요청을해야합니까, 내 응용 프로그램이이 요청을 처리한다 : 내가 정말 테스트 할 것은 다음과 같은이기 때문에, 문제의

. 컨트롤러를 지정하고 싶지는 않습니다. 실행중인 응용 프로그램의 경우 "/ customer"봄 요청이 어떤 컨트롤러가 내 요청을 해결하기 때문에. 나는 내가 백엔드에 요청을 보내는 브라우저 또는 다른 클라이언트임을 실제로 시뮬레이트하고 싶다.

내가 이것을 테스트 할 이유는 테스트 기능은 "현실 세계"

내가 이해하는 당신이 예제를 줄 수있는 작동하지 않지만, 그렇지 않으면 시험의 일종 어떤 방식으로 전달하는이다 테스트는 생산 실행과 다릅니다.

매개 변수가있는 양식 내에서 파일 업로드가 있다고 가정합니다. 내 컨트롤러 기능이 하나입니다

@RequestMapping(value="/{id}", method = RequestMethod.PUT, headers="content-type=multipart/form-data") 
public ResponseEntity<String> createFromMyForm(@PathVariable("id") Long id, @RequestParam String myParameter, @RequestParam MultipartFile myFile) { 
//... 
} 

가 RequestMethod.PUT에서 살펴보고, 이것이 생산 빌드에서 작동하지 않는 파일을 업로드 HTML 표준 POST이기 때문이다. 내 단위 테스트에서

나는이 일을하고있다 :

// setup request 
MockMultipartHttpServletRequest multipartRequest = new MockMultipartHttpServletRequest(); 
MockHttpServletResponse multipartResponse = new MockHttpServletResponse(); 

// Open file 
final FileInputStream fis = new FileInputStream("img/test.png"); 
MockMultipartFile multipartFile = new MockMultipartFile(
      "myParameter", fis); 

// generate multipart mock 
multipartRequest.addFile(multipartFile); 
multipartRequest.addParameter("json", "test"); 

// send request 
handlerAdapter.handle(multipartRequest, multipartResponse, controller); 

문제 : 시험은 통과하면서해야하지. 이 테스트가 통과하는 이유는 여러 가지입니다. 먼저 요청을 지정합니다. 나는 요청이 있다고 말하지 않고, 대신에 나는 MultipartRequest를 가지고 있다고 말해야 만한다. 이는 dispatcher 서블릿이 isMultipartRequest()와 같은 함수에서 true를 반환하도록 유도합니다. 프로덕션 실행에서는 PUT 메소드에 다중 요청이 없으므로 false를 반환합니다. 또한이 요청을 처리해야하는 컨트롤러를 다시 지정합니다.

아마도 다른 예제가 있지만, 내가 말하고자하는 것은, 내 html 프로토콜과 그 밖의 모든 것을 포함하여 실제 조건에서 내 응용 프로그램을 테스트 할 수있는 방법이 있습니까?

정말 도움이 될만한 점이 많습니다. 사전에

감사 코드와 프레임 워크 간의 통합을 테스트하지만, 어느 시점에서 응용 프로그램을 배포하고 진짜 테스트해야합니다

답변

1

통합 테스트.

HtmlUnit을 살펴보십시오. 웹 애플리케이션 탐색 및 기능 테스트를위한 Junit 기반 프레임 워크입니다.

더 나은 것은 아직 Selenium입니다.이것은 실제로 실제 브라우저를 구동하고 페이지의 내용을 주장합니다. HtmlUnit보다 더 복잡하지만, 일반적으로 자바 스크립트가 많은 웹 애플리케이션의 경우보다 의미있는 테스트가 발생합니다.

+0

감사합니다. 그래서 봄에 의해 지원되는 기능들로 이런 종류의 것들을 테스트 할 수있는 기회가 없습니까? – Alexander

+0

어쩌면 한 가지 더 많은 정보, 나는 html 답장을 테스트하는 것이 아닙니다. JSON 요구 사항도 있습니다. 이러한 프레임 워크에서 요청에 대해 개별 헤더를 설정할 수 있습니까? – Alexander

+1

@Alexander : Spring은 단원 테스트 및 통합 테스트를 지원합니다. 그리고 그렇습니다.이 프레임 워크는 헤더를 완벽하게 제어합니다. – skaffman

1

지난 주에 나는

MockServletContext

  • MockServletConfig
    • 내가 그들을 사용하지,이 두 개의 스프링 클래스를 발견하고, 나는 그들이 작동하는 방법 100 % 확실하지 않다. 그러나 Spring Reference에서 언급되지 않았기 때문에이를 지적하고자했습니다. 그리고 배포 된 서버를 실행하면서 첫 번째 실제 통합 테스트를 수행하는 것이 많은 일이라고 생각합니다. 그래서 조롱하는 사람들이 당신이 테스트하기를 원하는 것들을 모의하지 않는다면, 저는 조롱을 사용하는 것이 좋습니다.


      하지만 실제로 배포 된 응용 프로그램이 필요합니다 (그의 answer에서 제안 된 skaffman과 같은). 브라우저를 설정 제어 할 수있는 프레임 워크이지만, 그것은 또한 브라우저

    • Apache HttpComponents HttpClient
    • 을 "시뮬레이션"는 HtmlUnit과 드라이버를 가지고 -

      • Selenium 2.0/Webdriver을 : 그럼 나는 다른 두 시험 Framwork를 언급하고 싶다. 그것은 셀레늄보다 낮은 수준이지만, 더 많은 시간을 필요로하는 동안 나는 10 분 안에 실행합니다. 진짜 셀레늄 테스트.