인프런 커뮤니티 질문&답변
쿠키/세션은 어떻게 테스트하는지 문의드립니다!
작성
·
352
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);
    }
테스트 코드를 아래 사진처럼 짜보았습니다

.
그러자, Response should contain header 'Set-Cookie' 라는 오류와 함께 테스트가 실패하게 됩니다.
Postman 으로 api 를 호출하면 Set-Cookie 헤더에 JSESSIONID 값이 잘 들어 오는 것을 확인하였습니다.
그러나, 테스트로 진행하면 JSESSIONID 도 무작위 값이 아닌 1, 2 로 들어오게 되어 'api 호출 후 세션이 생성되어 쿠키에 들어갔는지' 테스트하는데 어려움을 겪어 질문 드립니다...ㅠㅠ
- api 호출 후, 응답에 세션과 쿠키가 잘 생성 되었는지를 테스트하려면 어떻게 해야할까요..? 
- 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 통신의 상태를 유지 관리하기 위해 사용되므로, 이를 테스트 코드에서 잘 다루기 위해서는 몇 가지 포인트를 고려해야 합니다.
- 세션과 쿠키 생성 확인: Spring의 - MockMvc를 사용하여 테스트를 진행할 때,- .andExpect()메서드를 통해 응답 헤더의 존재 여부와 특정 값을 검증할 수 있습니다.- Set-Cookie헤더를 통해 세션 쿠키(- JSESSIONID)가 설정되었는지 확인할 수 있습니다. 만약,- JSESSIONID값이 테스트마다 고정된 값을 가지는 경우, 테스트 환경에 따라 세션 관리 방식이 달라지므로, 실제 값보다는 해당 헤더의 존재 여부를 확인하는 것이 중요합니다.
- 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 호출 후 응답에 세션이 잘 생성되었는지를 간단히 확인할 수 있습니다. 하지만, 실제 쿠키의 값까지 정확하게 테스트하기 위해서는 별도의 설정이나 상황에 따른 구현이 필요할 수 있습니다.
테스트 환경에서의 세션과 쿠키를 다루는 것은 실제 서비스의 동작을 정확히 모의하기 위해 중요한 부분입니다. 위의 정보들이 종혁님의 테스트 구현에 도움이 되기를 바랍니다.






