워밍업 클럽 4기 백엔드 - 4주차 발자국

워밍업 클럽 4기 백엔드 - 4주차 발자국

👣4주 차 발자국

 

강의 요약

섹션 7. Mock을 마주하는 자세

 

Test double

테스팅이 어려운 경우, 실제 객체를 대신해 테스트를 진행할 수 있도록 만들어주는 객체

  • Dummy

  • Fake

  • Stub

  • Spy

  • Mock

 

Dummy

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

  • 객체는 전달되지만 사용되지 않는 객체이다.

Fake

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

Stub

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

  • 고정값을 반환하는 객체로, 정해진 응답이 필요시 사용

Spy

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

  • 일부는 실제 객체처럼 동작시키고, 일부만 스터빙 할 수 있다.

Mock

  • 행위에 대한 기대를 명세하고 그에 따라 동작하도록 만들어진 객체

Stubbing ?

  • Mock 객체의 행동을 조작하는 것.

  • Stub은 메서드가 특정 값을 반환하도록 설정하기 때문에, 반환값에 대한 검증을 한다.

  • Mock은 특정 메서드가 올바르게 호출 되었는지 검증한다.

  • Stub 은 상태 검증, Mock 은 행위 검증



    Mokito 주요 애너테이션


    @Mock, @Spy, @InjectMocks, @MockBean, @SpyBean


    각 애너테이션 요약 - 링크

    BDDMockito

  • BDD 스타일로 Mockito를 사용할 수 있도록 지원해주는 라이브러리

  • Mockito를 상속해서 구현한 객체로써 모든 기능은 Mockito와 동일


     

    섹션 8. 더 나은 테스트를 작성하기 위한 구체적 조언


    하나의 테스트에 하나의 검증만 수행

  • 분기문, 반복문 등의 논리 구조를 지양

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

제어 가능한 테스트가 되도록 작성

  • LocalDate.now(), LocalDateTime.now() 와 같이 외부요인으로 제어가 불가능한 경우는 사용하지 않는 게 좋다.

  • 제어할 수 없는 값을 제어 가능하게 변경하자.

    테스트 간 독립성 보장

  • 외부 조건, 순서, 공유 상태 등에 영향을 받지 않고 항상 동일한 조건에서 수행되어야 한다.

    Test Fixture

  • given절에 테스트의 픽스처를 구성한다. (가독성과 유지보수 측면에서 유리)

     

  • 별도의 data.sql 데이터를 추출하지 않는다.

  • 단위테스트 내에서 모두 표현한다.

     

  • data.sql과 같은 공통 로직으로 테스트 픽스처 구성하지 않기

  • 픽스처 생성 로직은 같은 테스트 클래스에서 관리하기

  • 테스트코드 안에 메서드를 추출할 때, 정말 필요한 값만 파라미터로 받기

     

    deleteAll(), deleteAllInBatch()

  • 엔티티 하나씩 remove() VS 한 번에 삭제 (bulk delete)

    • deleteAll()은 다수의 쿼리 발생으로 테스트 비용이 증가할 수 있다.

       

  • deleteAll()은 연관된 엔티티가 삭제되고, deleteAllInBatch()는 삭제가 안된다.

  • 용도에 맞게 각 메서드를 적절히 사용해야 한다.

 

@ParameterizedTest, @DynamicTest

  • @ParameterizedTest

    • 동일한 테스트를 다른 입력값으로 테스트 할 때 사용

    • @ValueSource, @CsvSource, @MethodSource 등 다양한 소스로부터 테스트가 가능하다.

  • @DynamicTest

    • 테스트를 실행할 때 동적으로 생성하는 방식

    • @TestFactory 를 사용한다.




    섹션 9. Appendix지만 중요한 것들


    학습 테스트

  • 잘 모르는 기능, 라이브러리, 프레임워크를 학습하기 위한 테스트 코드

  • 여러 테스트 케이스를 스스로 정의하고 검증하는 과정을 통해 구체적인 동작과 기능을 학습

    Spring Rest Docs

  • 테스트 코드를 통한 API 문서 자동화 도구

  • API 명세를 문서로 만들고 제공함으로써 협업을 원활하게 한다.


    강의 회고

     

    Layer 별로 어느 도구들을 사용하며 테스트를 해야 하는지 알 수 있었다. 특히 Presentation layer에서 Mock 사용법이 가장 기억에 남을 것 같다. 아무래도 테스트 코드를 작성 안하고 수동으로 테스트를 해왔을 때, Presentation layer의 결과를 직접 보면서 했기 때문에 이 부분을 어떻게 자동화를 할 수 있을지에 대한 궁금증이 해결되는 순간이였다.


    Mock 애너테이션별 사용법을 배운 것도 앞으로 테스트 코드를 작성하는데 큰 도움이 될 것 같다고 느꼈고, 강의 내내 TDD로 추가 요구사항을 해결해 나가는 점이 TDD 방식을 자연스럽게 익히게 된 것 같아 학습에 뭔가 여운이 남는다.


    그 외에도 BaseEntity 사용과 같은 클린 코드를 위한 설계와 리팩터링도 강의 내내 이루어져 복습까지 함께 하는 느낌이였다.
    아마 강의를 다시 들어야 온전히 습득할 수 있겠지만, 이번 첫번째에도 많은걸 얻을 수 있었던 것 같다.


미션 과정 & 회고

강의내용을 떠올리면서 계층별로 어느 부분에 중심적으로 테스트 해야하는지를 떠올리며 BDD 패턴을 적용해 해결 했다.

예제게 우리가 친숙한 댓글 로직 이여서 효율적인 테스트에만 집중해서 해결 할 수 있었던 것 같다.

초기화 부분에 대한 부분도 고려하면서 미션을 했다.

댓글을 작성해보세요.

채널톡 아이콘