스프링/테스트

Postman을 활용한 API 테스트에서의 로그인 세션 유지 및 타 API 테스트

Ash_jisu 2024. 4. 19. 12:05

간략 소개

Postman은 API를 테스트하고 디버그하는 데 유용한 강력한 도구입니다. 그러나 로그인 세션을 유지해야 하는 경우, 특히 세션 정보를 다른 API 요청에도 적용해야 할 때가 있습니다. 이 글에서는 Postman을 사용하여 로그인 세션을 유지하고 다른 API를 테스트하는 방법에 대해 알아보겠습니다.

 

흐름

  1. 로그인 요청 보내기: Postman을 사용하여 로그인 API에 요청을 보냅니다. 사용자 인증이 성공하면 서버로부터 세션 ID를 받습니다. 
  2. 인증 정보 저장: 받은 인증 정보를 Postman의 환경 변수나 글로벌 변수에 저장합니다. 주로 헤더나 쿠키에 저장하여 세션을 유지합니다.
  3. 다른 API 요청 시 인증 정보 사용: 다른 API를 테스트할 때, 저장된 세션 정보를 사용하여 요청합니다. Postman에서는 변수를 사용하여 세션 정보를 헤더나 쿠키 값으로 전달할 수 있습니다.

실습

  • 로그인 요청 보내기
    • body에 json의 형태로 id와 pwd을 입력해서 로그인 요청을 하면 다음과 같은 세션 관련된 정보가 Cookies에 저장이 됩니다.

 

  • 인증 정보 저장
    • 이제 로그인 세션 정보가 필요했던 타 API 테스트에서 Cookies정보에 해당 내용이 저장되었는지 확인합니다.

 

  • 로그인 세션 없는 경우의 테스트
    • Controller코드 내용, Login 어노테이션을 통해서 세션 쿠키 정보를 받고 Service에서 해당 사용자가 Question 수정 권한이 있는지 확인한다.
   //Update API
    @PutMapping("/questions")
    public ResponseDto updateQuestions(@Login User user, @RequestBody QuestionUpdateDto questionUpdateDto) {
        boolean updated = questionsService.updateQuestionsByQuestionId(user, questionUpdateDto);
        if (!updated) {
            return ResponseDto.BAD_REQUEST;
        }
        return ResponseDto.OK;
    }

권한 없는 경우 예외 처리

  • 로그인 세션 저장 후 API 테스트
    • 정상 작동하는 것을 확인 할 수 있다


테스트 코드 작성

이 부분은 게시물의 주 내용과는 관련 없지만 추후에 테스트 코드 작성하는 분들께 도움이 되고자 덧붙입니다. 테스트 코드 일부분입니다.

다음과 같이 .session에 MockHttpSession을 파라미터로 넣어주면 됩니다

    @Test
    public void updateQuestions() throws Exception {

    	mockMvc.perform(
                put("/api/v1/questions")
                        .content(objectMapper.writeValueAsString(requestBody))
                        .contentType("application/json")
                        .session(doLogin())
                )  .andExpect(status().isOk());
    }
    
    
    //하단 부분은 팀원이 만든 메서드를 가져다 썼습니다
      MockHttpSession doLogin() throws Exception {
        Map<String, String> request = new HashMap<>() {{
            put("user_id", userId);
            put("password", userPw);
        }};
        return (MockHttpSession) mockMvc.perform(post("/api/v1/users/login")
                        .contentType("application/json")
                        .content(objectMapper.writeValueAsString(request)))
                .andExpect(status().isOk())
                .andReturn().getRequest().getSession();
    }