🤝 활동/내배캠TIL

[내일배움캠프 42일차 TIL] 테스트 활용 과제 제출

MNY 2024. 6. 18. 03:01
728x90
반응형
2024.06.17.(월)
오늘의 진도 : 테스트 활용 과제 제출까지...

아무것도 하기 싫타...
개인과제, 오늘의 회고 이렇게 2개의 큰 틀로 나누어 정리할 것이다.

 

개인과제 제출

  • 구현 기능
    • AOP 추가하기
      • 모든 API(Controller)가 호출될 때, Request 정보(Request URL, HTTP Method)를 @Slf4J Logback 라이브러리를 활용하여 Log로 출력해주세요.
      • 컨트롤러 마다 로그를 출력하는 코드를 추가하는것이 아닌, AOP로 구현해야만 합니다.
    • DTO, Entity Test 추가하기
      • @Test 를 사용해서 DTO 와 Entity Test 를 추가합니다.
      • User, Post, Comment, DTO 에 존재하는 메서드들에 대해서 “단위 테스트” 를 추가합니다.
      • 특정 상황에 예외가 정상적으로 발생하고 있는지도 테스트 합니다.
  • 만들지 못한 이유에 대한 고촬 (숙제 제출 후 고촬)

일단, 처음에는 강의에서 배웠던대로 mvcTest 코드를 작성했다. 하지만 계속 405 error가 뜨면서 값이 들어가지 않는다는 문구가 떴다. "내가 작성한 mvcTest 코드"처럼 mvc 부분을 변경해줘야 하는데 그렇게 하지 않아서 값이 들어가지 않았던 것이다. 그렇게 해결되는 줄 알았던 3번의 Controller Test 추가하기..

그런데 MockHttpServletResponse의 Body 부분에 분명 해당 controller의 response에는 data라는 값을 포함되는데, 출력되는 것은 httpStatusCode와 message 뿐이었다. 이 부분이 왜 그런 것인지 몰라 튜터님께 여쭤본 결과 "response에 값 넣어주기" 처럼 직접적으로 우리가 넣어줘야 한다는 거였다. 강의를 보며 작성했던 코드들을 살펴보니 given... 이 부분이 있었다. 숙제 제출에 맞추지는 못했지만, 알 수 있었기에 다행이었다.

 

  • 내가 작성한 mvcTest 코드
@Test
    @DisplayName("게시물 등록 요청 처리")
    void test2() throws Exception {
        // given
        this.mockUserSetup();
        String title = "Test Title";
        String content = "Test Content.";

        BoardRequestDto requestDto = new BoardRequestDto(
                title,
                content
        );

        String postInfo = objectMapper.writeValueAsString(requestDto);

        // when - then
        mvc.perform(post("/api/boards")
                        .content(postInfo)
                        .contentType(MediaType.APPLICATION_JSON)
                        .accept(MediaType.APPLICATION_JSON)
                        .principal(mockPrincipal)
                )
                .andExpect(status().isCreated())
                .andDo(print());
    }

 

  • responsebody에 값 넣어주기
@Test
    @DisplayName("특정 게시물 조회 요청 처리")
    void test3() throws Exception {
        // given
        Long boardId = 1L;
        String title = "Test Title";
        String content = "Test Content.";
        User user = new User();

        BoardRequestDto requestDto = new BoardRequestDto(
                title,
                content
        );

        Board board = new Board(requestDto, user);
        BoardResponseDto responseDto = new BoardResponseDto(board);
        given(boardService.selectBoard(any(Long.class))).willReturn(responseDto);

        // then
        mvc.perform(get("/api/boards/{boardId}", boardId)
                        .contentType(MediaType.APPLICATION_JSON)
                        .accept(MediaType.APPLICATION_JSON)
                )
                .andExpect(status().isOk())
                .andDo(print());
    }

 

  • 기술질문
    • Q : 통합 테스트와 단위 테스트의 차이점에 대해서 설명해주세요.
      • 단위 테스트는 소프트웨어의 특정 기능이나 메서드 등 작은 단위를 테스트하여 코드가 올바르게 작동하는지 확인하는 데 중점을 둡니다. 반면 통합 테스트는 여러 모듈이 함께 동작할 때 발생할 수 있는 문제를 확인하기 위해 실행됩니다. 
    • Q : 통합 테스트과 단위 테스트의 장/단점에 대해서 설명해주세요.
      • 단위 테스트는 빠른 피드백과 버그의 조기 발견, 독립성 등의 장점이 있어 개발 초기 단계에서 매우 유용합니다. 하지만 시스템 전체의 동작을 보장하지 못하고, 실제 환경과의 차이로 인해 제한적인 검증만 가능합니다.
      • 반면, 통합 테스트는 여러 모듈 간의 상호작용을 검증하여 전체 시스템의 안정성을 확인할 수 있습니다. 실제 환경과 유사한 조건에서 테스트할 수 있어, 사용자 시나리오를 검증하는 데 유리합니다. 그러나 실행 속도가 느리고 디버깅이 복잡하며, 설정과 유지보수에 많은 자원이 필요하다는 단점이 있습니다.
    • Q : 레이어별로 나누어서 Slice Test 를 하는 이유에 대해서 설명해주세요.
      • Slice Test는 소프트웨어의 특정 레이어에 집중하여 해당 부분의 동작을 검증하는 테스트 방법입니다. 
        레이어별로 나누어 Slice Test를 수행하는 데 있어서 가장 중요한 이유 세 가지는 다음과 같습니다. 
      • 첫째, 각 레이어에서 발생한 문제를 빠르게 식별하여 디버깅 시간을 단축할 수 있습니다.
      • 둘째, Slice Test는 빠른 피드백 루프를 제공하여 코드 변경 후 버그를 조기에 발견하고 수정할 수 있게 합니다. 
      • 셋째, 모듈화된 코드의 신뢰성을 검증하여 코드의 재사용성과 유지보수성을 높입니다.
    • Q : 테스트 코드를 직접 짜보고 나서 느낀 테스트 필요성을 적어주세요.
      • 테스트 코드를 직접 작성하면서 가장 중요하다고 느낀 점은 두 가지는 다음과 같습니다.
      • 첫 째, 예측 가능한 에러 발견입니다. 
        테스트 코드를 작성하면 코드의 각 부분에서 어떤 에러가 발생할 수 있는지 미리 예측하고 발견할 수 있습니다. 예를 들어, DTO나 엔티티의 필드 매핑 문제나 기능적 오류를 사전에 파악할 수 있어서, 개발 초기에 문제를 해결할 수 있습니다.
      • 둘 째, 기능의 정확성 검증입니다.
        테스트 코드를 통해 구현한 기능이 예상대로 정확하게 동작하는지 확인할 수 있습니다. 새로운 기능을 추가하거나 기존 코드를 수정할 때, 테스트를 실행하여 기능이 제대로 작동하는지를 확인함으로써 코드의 신뢰성을 높일 수 있습니다.
    • Q : 테스트 코드를 짜면서 어려웠던 점을 적어주세요.
      • 테스트 코드를 짜면서 가장 어려웠던 점은 두 가지입니다.
      • 첫째로, 의도적인 테스트 케이스 설계였습니다. 특히 복잡한 비즈니스 로직이나 다양한 상황에 대응하는 테스트 케이스를 만드는 것이 어려웠습니다. 모든 경로와 예외 상황을 고려하여 완전한 테스트 커버리지를 달성하는 것이 중요하다는 점을 배웠습니다. 예를 들어, 다양한 입력 조건이나 경로에 대해 어떻게 테스트를 설계할지 고민하고 구현하는 것이 필요했습니다.
      • 둘째로, **의존성 관리와 모의 객체(Mock)**를 사용하는 것이었습니다. 특히 외부 서비스나 데이터베이스와 같은 의존성이 있는 코드를 테스트할 때, 모의 객체를 사용하여 의존성을 제어하고 테스트의 일관성을 유지하는 것이 중요했습니다. 처음에는 모의 객체를 어떻게 작성하고 적용해야 할지 이해하는 데 시간이 걸렸습니다.

* 제출한 Repository

 

GitHub - ysy56/movieFeed: 🎞 영화 소개 뉴스피드

🎞 영화 소개 뉴스피드. Contribute to ysy56/movieFeed development by creating an account on GitHub.

github.com

 


오늘의 회고

  • 12시간 중 얼마나 몰입했는가?

0시간? 과제 제출 직전 정도에 열심히하고..

나머지는 너무 아무것도 하기 싫어서 멍 때리고 젭에서 나돌아댕기고ㅎ

튜터님께 찾아가서 열심히 대화했더니 하루가 다 지나갔다!

 

  • 오늘의 생각

요즘따라 너무 피곤한 것 같다.

수면주기를 다시 일정하도록 변경해야겠다.

공부하기 싫으니까 책만 읽었는데..

근데 생각해보면 이것도 공부긴한데..

그냥 뭘 읽는게 더 좋은 하루였따.

 

  • 내일 학습할 것은 무엇인지

일단 Controller Test 코드를 어떻게 작성할지 감을 잡았으니 그 부분을 추가적으로 작성하고

Service Test 코드까지 작성해서 내일 재제출하는게 나의 목표이다. 

728x90
반응형