
워밍업 클럽 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
각 애너테이션 요약 - 링크
BDDMockitoBDD 스타일로 Mockito를 사용할 수 있도록 지원해주는 라이브러리
Mockito를 상속해서 구현한 객체로써 모든 기능은 Mockito와 동일
섹션 8. 더 나은 테스트를 작성하기 위한 구체적 조언
하나의 테스트에 하나의 검증만 수행분기문, 반복문 등의 논리 구조를 지양
테스트 케이스 별로 각각의 테스트 코드를 작성
제어 가능한 테스트가 되도록 작성
LocalDate.now(), LocalDateTime.now() 와 같이 외부요인으로 제어가 불가능한 경우는 사용하지 않는 게 좋다.
제어할 수 없는 값을 제어 가능하게 변경하자.
테스트 간 독립성 보장외부 조건, 순서, 공유 상태 등에 영향을 받지 않고 항상 동일한 조건에서 수행되어야 한다.
Test Fixturegiven절에 테스트의 픽스처를 구성한다. (가독성과 유지보수 측면에서 유리)
별도의 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 패턴을 적용해 해결 했다.
예제게 우리가 친숙한 댓글 로직 이여서 효율적인 테스트에만 집중해서 해결 할 수 있었던 것 같다.
초기화 부분에 대한 부분도 고려하면서 미션을 했다.
댓글을 작성해보세요.