워밍업 클럽 3기 BE 클린코드&테스트 - 4주차 발자국

워밍업 클럽 3기 BE 클린코드&테스트 - 4주차 발자국

학습 내용

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

Test Double: 테스트에서 실제 객체를 대체하여 사용하는 가짜 객체의 총칭 (대역 객체)

  • Dummy

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

  • Fake

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

  • Stub

    • 테스트에서 요청한 것에 대해 미리 준비한 결과를 제공하는 객체 (그 외에는 응답하지 않음)

    • 상태 검증 /

      Stateful

  • Spy

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

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

  • Mock

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

    • 행위 검증 / Stateless

@Mock, @MockBean, @Spy, @SpyBean, @IngectMocks

  • @Mock

    • 진짜 객체가 아닌 가짜 객체를 생성해서 (테스트에) 사용

    • Spring Context와 무관

    • @InjectMocks나 수동으로 주입 가능

    • 단위 테스트에서 사용

  • @MockBean

    • Spring에 의존적

    • Spring 빈에 등록된 객체를 Mock으로 대체

    • Spring에서 의존성 주입을 해줌

    • 통합 테스트에 사용

  • @Spy

    • 실제 객체의 일부 동작만 Mocking (객체의 일부만 stub 처리)

    • Spring Context와 무관

    • 단위 테스트에 사용

  • @SpyBean

    • Spring에 의존적

    • Spring Bean에 등록된 객체를 Spy로 대체

    • 통합 테스트에 사용

  • @InjectMocks

    • @Mock 또는 @Spy로 만든 객체를 의존성으로 주입(해주는 대상 클래스 지정)

 

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

  • 테스트 하나 당 목적은 하나

    • 한 문단에 하나의 주제만

    • 논리 구조(분기문, 반복문)은 최대한 지양하기

  • 완벽한 제어

    • 테스트 환경 조성시 모든 조건을 완벽하게 제어할 수 있어야 함

    • 현재 날짜/시간, 랜덤 등 제어할 수 없는 변수 사용 지양

      • 사용해야 하면 파라미터로 넘겨서 상위 계층에서 관리

  • 테스트 환경의 독립성, 테스트 간 독립성 보장

    • given절에서 팩토리 메서드 대신 순수한 생성자/builder 기반으로 객체 생성

    • 공유 자원 사용 X

  • Test Fixture

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

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

      • 각 테스트마다 명시해 한 눈에 들어오도록 테스트 작성

      • @BeforeEach, @

        BeforeAll, @AfterEach, @AfterAll

         

    • Test Fixture 클렌징

  • Test Fixture 클렌징

    • deleteAll()

    • deleteAllInBatch()

  • @ParameterizedTest, @DynamicTest

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

    • @DynamicTest: 시나리오 기반으로 테스트할 때 사용 (테스트를 실행할 때 동적으로 생성하는 방식)

  • 수행 환경 통합하기

    • 테스트도 비용이기 때문에 환경을 통합해야 한다.

    • 통합 클래스를 만들어 서버 뜨는 횟수를 최소화

  • private method test

    • private method는 테스트 수행할 필요 없음

  • 테스트에서만 필요한 코드

    • 만들어도 되지만 최대한 지양

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

  • 학습 테스트

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

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

  • Spring Rest Docs

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

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

미션

Day 16

https://inf.run/2pwfM

Day18

https://inf.run/jgrRS

 

회고

드디어 열심히 달려온 워밍업 클럽이 끝났다. 한달 동안 가독성 좋은 코드를 작성하는 방법과, 코드를 테스트하는 법에 대해 정말 많은 것을 배웠다. 솔직히 후반부에는 진도를 따라가기도 벅차게 느껴졌고, 미션도 몇번 놓쳤지만 포기하지 않고 완주해낸 것 자체가 뿌듯하다. 또한 그간 코드를 작성하며 크게 신경쓰지 않았던 것들에 대해 완전히 다른 시각을 접할 수 있어서 정말 알차고 좋은 시간이었다. 아직 학습한 내용을 온전히 소화하지는 못했지만, 다시한번 강의 내용을 복습하며 공부해보고, 수료식 전까지 놓친 미션들도 다시 수행해볼 것이다.

댓글을 작성해보세요.

채널톡 아이콘