🖤인프런만의 100% 블프 이벤트🖤

🎁100% 환급+할인+당첨 가능한 인프런 블프 구경오세요!

[인프런 워밍업 클럽 2기 클린코드&테스트코드] 4주차 발자국

[인프런 워밍업 클럽 2기 클린코드&테스트코드] 4주차 발자국

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

1. 학습 내용 요약

  • Persistence Layer

    • Data Access의 역할

    • 비즈니스 가공 로직이 포함되어서는 안됨

    • Data에 대한 CRUD에만 집중한 레이어

  • Business Layer

    • 비즈니스 로직을 구현하는 역할

    • Persistence Layer와의 상호작용(Data를 읽고 쓰는 행위)를 통해 비즈니스 로직을 전개

       

  • Presentation Layer

    • 외부 세계의 요청을 가장 먼저 받는 계층

    • 파라미터에 대한 최소한의 검증을 수행

  • MockMvc

    • Mock(가짜) 객체를 사용해 스프링 MVC 동작을 재현할 수 있는 테스트 프레임워크

  • 트랜잭션에 대한 이야기

    • readOnly = true

      • 읽기 전용

      • CRUD에서 CUD 동작 X / only Read

      • JPA에서 CUD 스냅샷 저장, 변경감지 X → 성능 향상

    • CQRS

      • Command와 Read의 분리

      • 두 동작이 서로 영향을 주지 않게 분리

         

         

  • Stubbing

    • 컴포넌트를 MockBean 처리하고 동작에 대한 가짜 행위를 정의하는 것

  • Test Double

     

    • Dummy

      • 아무 것도 하지 않는 깡통 객체

    • Fake

      • 단순한 형태로 동일한 기능은 수행하나, 프로덕션에서 쓰기에는 부족한 객체

    • Stub

      • 테스트에서 요청한 것에 대해 미리 준비한 결과를 제공하는 객체

      • 그 외에는 응답하지 않음

    • Spy

      • Stub이면서 호출된 내용을 기록하여 보여줄 수 있는 객체

      • 일부는 실제 객체처럼 동작시키고 일부만 Stubbing할 수 있음

    • Mock

      • 행위에 대한 기대를 명세하고

      • 그에 따라 동작하도록 만들어진 객체

       

  • 한 문단에 한 주제

     

    • 논리 구조가 들어가지 않는 형태로 구성하는 것이 좋음

      • Parameterize Test

      • 케이스 테스트 코드를 각각 따로 작성

  • 완벽하게 제어하기

    • 제어할 수 없는 것들은 상위 계층으로 분리해서 테스트 가능하게

  • 테스트 환경의 독립성을 보장하자

     

  • 테스트 간 독립성을 보장하자

    • 테스트 간에는 순서가 없어야 함

    • 공유 자원을 사용하는 경우 테스트 간 순서가 생길 수 있음

  • 한 눈에 들어오는 Test Fixture 구성하기

    • Fixture

      • 고정물, 고정되어 있는 물체

      • 테스트를 위해 원하는 상태로 고정시킨 일련의 객체

         

    • 중복으로 세팅하는 경우에는 셋업에서 구성을 하면 어떨까

      • 공유 객체를 사용하는 것과 동일한 효과를 가져올 수 있음

         

      • 테스트와 결합도가 생김

      • 코드가 길어지면 의도가 한 눈에 보이지 않을 수 있음

         

    • data.sql 같이 셋업을 다른 파일에 옮기면 픽스쳐의 파편화가 일어날 수 있기에 지양

    • 빌더를 생성할 땐 파라미터에 테스트에서 필요한 것만 남겨놓자

    • 클렌징

      • DeleteAll() Vs. DeleteAllInBatch()

        • DeleteAll()은 각 엔티티를 개별적으로 삭제하며, 삭제 전 select 쿼리를 실행

          • 대신 지우는 순서가 상관없어질 수 있음

          • 물론 항상 되는 것은 아님

        • DeleteAllInBatch()는 단일 쿼리로 모든 데이터를 삭제하여 더 효율적

          • 대량의 데이터를 처리할 때는 DeleteAllInBatch()가 성능상 유리할 수 있음

             

  • @DynamicTest

    • 어떠한 시나리오를 기반으로 상태를 공유하면서 테스트를 진행할 수 있음

  • 테스트 환경 통합

    • 테스트 환경을 통합하여 테스트 성능 최적화

    • 환경이 다르면 서버가 테스트마다 새로 떠야함

       

       

  • Rest Docs Vs. Swagger

    • RestDocs

      • 장점

        • 테스트를 통과해야 문서가 만들어짐 (신뢰도 증가)

        • 프로덕션 코드에 비침투적

      • 단점

        • 코드 양이 많음

        • 설정 어려움

    • Swagger

      • 장점

        • 적용이 쉬움

        • 문서에서 바로 API 호출을 수행해볼 수 있음

      • 단점

        • 프로덕션 코드에 침투적

        • 테스트와 무관하기 때문에 신뢰도가 떨어질 수 있음


2. 미션 회고

  • Day 15. Layered Architecture 구조의 레이어별 특징을 정리하고, 어떻게 테스트 하면 좋을 지 정리하는 미션이었다. Persistence Layer, Business Layer, Presentation Layer 역할에 대하여 다시 정리해보고, 레이어의 특징에 따른 테스트 코드 예시를 정리해볼 수 있는 기회였다.

  • Day 18. @Mock, @MockBean, @Spy, @SpyBean, @InjectMocks의 차이를 정리하고, 주어진 테스트 코드를 리팩토링하는 미션이었다. 강의 시간에 다루었던 어노테이션들에 대해서 자세히 알아볼 수 있었다. 또한, 코드를 리팩토링하며 강의에서 배웠던 내용들을 응용해 볼 수 있었다.


3. KPT

  • Keep

    • 시험 기간이 겹쳤지만, 과제와 진도를 밀리지 않고 잘 수행하였다.

       

  • Try

     

    • 학습했던 내용들을 앞으로 잘 활용하여, 한층 더 성장한 개발자가 되어야겠다.


4. 느낀점

  • 4주간의 워밍업 클럽 일정이 마무리되었다. 처음 워밍업 클럽을 알게 되었을 때, 테스트에 대해 깊이 있게 학습할 수 있는 좋은 기회라고 생각하여 신청했다. 그러나 클럽 활동을 통해 다양한 지식과 기술을 배울 수 있었을 뿐만 아니라, 다른 참가자들의 코드와 질문들을 보면서 새로운 시각을 갖게 되고, 많은 자극을 받을 수 있었다. 다음 워밍업 클럽이 열린다면, 한번 더 참가하고 싶다.

댓글을 작성해보세요.

채널톡 아이콘