인프런 커뮤니티 질문&답변

종혁님의 프로필 이미지

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

Presentation Layer 테스트 (2)

쿠키/세션은 어떻게 테스트하는지 문의드립니다!

작성

·

141

0

  • 배경

회원가입을 할 때, 이메일로 인증한 회원만 회원가입이 진행되도록 하는 구현중에 있습니다.

그래서, 이메일로 인증한 회원에 한해서 MAIL_VERIFIED_MEMBER 세션을 만들어서 반환하고, 회원가입할 때 MAIL_VERIFIED_MEMBER 세션이 있는지 확인하고자 합니다.

 

그래서, 이메일로 인증한 회원에 MAIL_VERIFIED_MEMBER 세션이 잘 들어가는지 Controller 테스트를 진행하고자 하는데, 어려움을 겪어서 질문드립니다.

 

이메일로 인증한 회원에 MAIL_VERIFIED_MEMBER 세션을 넣어주는 API이며, 이 api 를 테스트 하고자 합니다.

@PostMapping("/email/authenticate")
    public ApiResponse<Void> authenticateEmail(@RequestBody @Valid EmailAuthenticationRequest request, HttpServletRequest servletRequest) {
         // 메일 인증한 회원에게 세션을 추가한다
        if (mailService.isValidMail(request.toServiceRequest())) { 
            HttpSession session = servletRequest.getSession();
            session.setAttribute(MAIL_VERIFIED_MEMBER, true);
            return ApiResponse.ok();
        }
        return ApiResponse.status(HttpStatus.BAD_REQUEST);
    }

 

테스트 코드를 아래 사진처럼 짜보았습니다

image.png

.

그러자, Response should contain header 'Set-Cookie' 라는 오류와 함께 테스트가 실패하게 됩니다.

Postman 으로 api 를 호출하면 Set-Cookie 헤더에 JSESSIONID 값이 잘 들어 오는 것을 확인하였습니다.

그러나, 테스트로 진행하면 JSESSIONID 도 무작위 값이 아닌 1, 2 로 들어오게 되어 'api 호출 후 세션이 생성되어 쿠키에 들어갔는지' 테스트하는데 어려움을 겪어 질문 드립니다...ㅠㅠ

 

  1. api 호출 후, 응답에 세션과 쿠키가 잘 생성 되었는지를 테스트하려면 어떻게 해야할까요..?

  2. andDo(print()) 에서 MockHttpServletRequest 의 Session Attrs 에는 세션 값이 왜 들어가 있을까요.. 해당 api 를 호출하면 세션이 아직 생성이 안되었을 것이라 생각했기 때문입니다..

해당 테스트를 실행할 때의 andDo(print()) 의 결과는 다음과 같습니다.


MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /member/email/authenticate
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"48"]
             Body = {"email":"123@naver.com","authCode":"312nj5acz"}
    Session Attrs = {verified_member=true}

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"application/json"]
     Content type = application/json
             Body = {"code":"0200","status":"OK","message":"OK","data":null}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

 

질문이 길어 죄송합니다..

그리고, 좋은 테스트 강의를 지식 공유 해주셔서 감사드립니다!!

 

답변 2

1

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, 종혁 님!

하나씩 답변 드리겠습니다.

 

1. api 호출 후, 응답에 세션과 쿠키가 잘 생성 되었는지를 테스트하려면 어떻게 해야할까요..?

원하시는 케이스가 잘 검증되는지 시도해 보셔야겠지만, set-cookie 헤더를 검증하는 것 대신 cookie()라는 헬퍼 메서드가 있습니다.

.andExpect(cookie()...)

한번 살펴보셔요 ㅎㅎ

 

2. andDo(print()) 에서 MockHttpServletRequest 의 Session Attrs 에는 세션 값이 왜 들어가 있을까요.. 해당 api 를 호출하면 세션이 아직 생성이 안되었을 것이라 생각했기 때문입니다..

요건 조금만 더 생각해보면 당연한 현상인데요 ㅎㅎ
print()를 요청/응답이 모두 완료된 후에 했기 때문에 request에 세션이 존재하는 형태로 print 된 것이 자연스럽습니다.

 

도움이 되셨기를 바랍니다.
감사합니다

0

안녕하세요, 인프런 AI 인턴입니다.

JWT나 Session/Cookie를 테스트할 때는 실제 어플리케이션에서 발급하고 관리하는 방식을 모의해서 테스트 코드 내에서 구현해야 합니다. 특히, 세션과 쿠키는 HTTP 통신의 상태를 유지 관리하기 위해 사용되므로, 이를 테스트 코드에서 잘 다루기 위해서는 몇 가지 포인트를 고려해야 합니다.

  1. 세션과 쿠키 생성 확인: Spring의 MockMvc를 사용하여 테스트를 진행할 때, .andExpect() 메서드를 통해 응답 헤더의 존재 여부와 특정 값을 검증할 수 있습니다. Set-Cookie 헤더를 통해 세션 쿠키(JSESSIONID)가 설정되었는지 확인할 수 있습니다. 만약, JSESSIONID 값이 테스트마다 고정된 값을 가지는 경우, 테스트 환경에 따라 세션 관리 방식이 달라지므로, 실제 값보다는 해당 헤더의 존재 여부를 확인하는 것이 중요합니다.

  2. andDo(print())에서의 세션 값: andDo(print())의 결과에서 세션 값이 출력되는 것은, MockMvc 테스트에서 실제 HttpServletRequest의 모의 객체를 사용하기 때문입니다. 이 모의 객체는 실제 어플리케이션의 HTTP 요청을 흉내 내므로, API 호출로 인해 세션에 값이 설정되면, 해당 세션 값이 MockHttpServletRequest에도 반영됩니다. 따라서, 테스트에서 해당 API를 호출할 때마다 세션 값이 생성되고 관리되는 것을 볼 수 있습니다.

테스트 코드에서 Set-Cookie 헤더의 존재 여부를 확인하는 방법을 예시로 설명하겠습니다. 아래는 테스트 코드에서 응답 헤더에 Set-Cookie가 포함되어 있는지 확인하는 간단한 방법입니다:

mockMvc.perform(post("/email/authenticate")
        .contentType(MediaType.APPLICATION_JSON)
        .content("{\"email\":\"123@naver.com\",\"authCode\":\"312nj5acz\"}"))
        .andExpect(status().isOk())
        .andExpect(header().exists("Set-Cookie")) // Set-Cookie 헤더의 존재 여부를 확인
        .andDo(print());

이 방법을 통해 API 호출 후 응답에 세션이 잘 생성되었는지를 간단히 확인할 수 있습니다. 하지만, 실제 쿠키의 값까지 정확하게 테스트하기 위해서는 별도의 설정이나 상황에 따른 구현이 필요할 수 있습니다.

테스트 환경에서의 세션과 쿠키를 다루는 것은 실제 서비스의 동작을 정확히 모의하기 위해 중요한 부분입니다. 위의 정보들이 종혁님의 테스트 구현에 도움이 되기를 바랍니다.

종혁님의 프로필 이미지

작성한 질문수

질문하기