워밍업 클럽 2기 BE 클린코드&테스트 발자국 4주차
Day 15. Spring & JPA 기반 테스트: Presentation Layer
Presentation Layer
외부 세계의 요청을 가장 먼저 받는 계층
파라미터에 대한 최소한의 검증을 수행한다.
MockMvc
Mock(가짜) 객체를 사용해 스프링 MVC 동작을 재현할 수 있는 테스트 프레임워크
미션 - 생각하는 레이어별 특징과 테스트 방법
Persistence Layer
데이터 저장 및 조회를 담당
데이터베이스에 연결하여 데이터 저장 및 조회가 잘 되는지 테스트
Business Layer
비즈니스 로직을 담당
비즈니스 규칙에 맞게 올바르게 동작하는지 테스트
Presentation Layer
사용자와 상호작용을 담당
사용자가 보낸 요청의 유효성 체크와 응답이 제대로 가는지 테스트
Day 16. Mock을 마주하는 자세
Test Double
상태 검증 -> Stub
행위 검증 -> Mock
@Mock, @Spy, @InjectMocks
@Mock
: Mock 객체로 만듬@InjectMocks
: Mock 객체를 주입해줌@Spy
: 일부만 Mock 객체로 만듬
BDDMockito
Mockito와 동일하다.
BDD 스타일로 이름만 변환.
Mockito.when().thenReturn();
BDDMockito.given().willReturn();
Day 17. 더 나은 테스트를 작성하기 위한 구체적 조언
한 문단에 한 주제!: 하나의 테스트 코드에서 하나의 테스트만!
완벽하게 제어하기: 제어 불가능한 영역은 상위 계층으로!
테스트 환경의 독립성을 보장하자
테스트 간 독립성을 보장하자
한 눈에 들어오는 Test Fixture 구성하기: given 절을 구성할 때의 주의사항
Test Fixture 클렌징
테스트 수행도 비용이다. 환경 통합하기
Q. private 메서드의 테스트는 어떻게 하나요?
해서도 안 되고 할 필요가 없다.
Q. 테스트에서만 필요한 메서드가 생겼는데 프로덕션 코드에서는 필요 없다면?
만들어도 되지만 보수적으로 접근하기!
Day 18. 학습 테스트 | REST Docs
학습 테스트
잘 모르는 기능, 라이브러리, 프레임워크를 학습하기 위해 작성하는 테스트
Spring REST Docs
테스트 코드를 통한 API 문서 자동화 도구
Spring REST Docs : https://docs.spring.io/spring-restdocs/docs/current/reference/htmlsingle/
Asciidoctor : https://asciidoctor.org/
Swagger : https://swagger.io/
미션 - @Mock, @MockBean, @Spy, @InjectMocks의 차이 정리
@Mock
: 해당 객체를 Mock 객체로 만든다.@MockBean
: Spring의 ApplicationContext에 Mock 객체로 만들어 빈으로 등록한다.@Spy
: 일부분만 Mock 객체로 만들어준다.@InjectMockes
: Mock 객체로 만들어 주입해준다.
미션 - 각 항목을 @BeforeEach, given절, when절 배치
@BeforeEach
void setUp() {
1-1., 2-1., 3-1. 사용자 생성에 필요한 내용 준비
1-2., 2-2., 3-2. 사용자 생성
}
@DisplayName("사용자가 댓글을 작성할 수 있다.")
@Test
void writeComment() {
// given
1-3. 게시물 생성에 필요한 내용 준비
1-4. 게시물 생성
1-5. 댓글 생성에 필요한 내용 준비
// when
1-6. 댓글 생성
// then
검증
}
@DisplayName("사용자가 댓글을 수정할 수 있다.")
@Test
void updateComment() {
// given
2-3. 게시물 생성에 필요한 내용 준비
2-4. 게시물 생성
2-5. 댓글 생성에 필요한 내용 준비
2-6. 댓글 생성
// when
2-7. 댓글 수정
// then
검증
}
@DisplayName("자신이 작성한 댓글이 아니면 수정할 수 없다.")
@Test
void cannotUpdateCommentWhenUserIsNotWriter() {
// given
3-3. 사용자2 생성에 필요한 내용 준비
3-4. 사용자2 생성
3-5. 사용자1의 게시물 생성에 필요한 내용 준비
3-6. 사용자1의 게시물 생성
3-7. 사용자1의 댓글 생성에 필요한 내용 준비
3-8. 사용자1의 댓글 생성
// when
3-9. 사용자2가 사용자1의 댓글 수정 시도
// then
검증
}
회고
아기다리 고기다리던 금요일 특강을 회사일때문에 참가하지 못했다.
하필 저번주도 다음주도 아닌 이번주 금요일에 하필...
아쉽지만 지금까지 공부하고 배운 내용을 내것으로 만들어 가야겠다.
출처
댓글을 작성해보세요.