네번째 발자국 👣

네번째 발자국 👣

Presentation Layer 테스트

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

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

@Mock, @Spy, @InjectMocks

@Mock : Mock(가짜) 객체로 만든다

@InjectMocks : Mock 객체를 주입해준다

@Spy : 기능들중 일부만 Mock으로 만든다.

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

  • 한문단에 한 주제

  • 완벽하게 제어하기 : 현재시간 랜덤 값 등 외부시스템과 연동하는 경우 상위계층으로

  • 테스트 환경의 독립성을 보장하자 : given 환경에서 다른 api 사용 지양, 생성자로만 구성하는 것이 좋다

  • 테스트간 독립성을 보장하자 : 공유자원 사용하지 않아야 한다.

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

  • Test Fixture 클렌징 : deleteAll() 와 deleteAllInBatch() 구분해서 사용

  • @ParameterizedTest : 값이나 데이터를 바꿔가면서 테스트 하고싶을 때

  • @DynamicTest : 시나리오 기반으로, 환경을 공유하면서 테스트 할수있다.

  • 테스트 수행도 비용이다. 환경통합하기

학습테스트

: 테스트를 하면서 학습하기

Spring REST Docs

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

 

미션

게시판 게시물에 달리는 댓글을 담당하는 Service Test

댓글을 달기 위해서는 게시물과 사용자가 필요하다.

게시물을 올리기 위해서는 사용자가 필요하다.

 

👇 처음 내가 작성했던 코드

@BeforeEach 
void setUp() {
1-1. 사용자 생성에 필요한 내용 준비
1-3. 게시물 생성에 필요한 내용 준비
1-5. 댓글 생성에 필요한 내용 준비
}

@DisplayName("사용자가 댓글을 작성할 수 있다.")
@Test
void writeComment() {
// given 
1-2. 사용자 생성
1-4. 게시물 생성

// when 
1-6. 댓글 생성

// then
검증
}
@DisplayName("사용자가 댓글을 수정할 수 있다.")
@Test
void updateComment() {
// given
2-2. 사용자 생성
2-4. 게시물 생성
2-6. 댓글 생성

// when
2-7. 댓글 수정

// then
검증
}
@DisplayName("자신이 작성한 댓글이 아니면 수정할 수 없다.")
@Test
void cannotUpdateCommentWhenUserIsNotWriter() {
//given 
3-2. 사용자1 생성
3-6. 사용자2 생성
3-6. 사용자1 게시물 생성 
3-8. 사용자1의 댓글 생성

//when 
3-9. 사용자2가 사용자1의 댓글 수정 시도

// then
검증 
}

👇 수정 한 코드  

@BeforeEach 
void setUp() {
1-1. 사용자 생성에 필요한 내용 준비
1-2. 사용자 생성
1-3. 게시물 생성에 필요한 내용 준비
1-4. 게시물 생성

}

@DisplayName("사용자가 댓글을 작성할 수 있다.")
@Test
void writeComment() {
// given 
1-5. 댓글 생성에 필요한 내용 준비

// when 
1-6. 댓글 생성

// then
검증
}
@DisplayName("사용자가 댓글을 수정할 수 있다.")
@Test
void updateComment() {
// given
2-5. 댓글 생성에 필요한 내용 준비
2-6. 댓글 생성

// when
2-7. 댓글 수정

// then
검증
}
@DisplayName("자신이 작성한 댓글이 아니면 수정할 수 없다.")
@Test
void cannotUpdateCommentWhenUserIsNotWriter() {
//given 

3-3. 사용자2 생성에 필요한 내용 준비
3-4. 사용자2 생성
3-7. 사용자1의 댓글 생성에 필요한 내용 준비
3-8. 사용자1의 댓글 생성

//when 
3-9 사용자2가 사용자1의 댓글 수정 시도


// then
검증 
} 

 미션 회고

처음엔 setUp()에 생성에 필요한 내용들만 배치해야한다고 생각하고 저렇게 코드를 작성했는데,

댓글 도메인에 대한 테스트라는 것에 중점을 둬야한다는 공통 피드백을 듣고 다시 수정했다. 앞으로 항상 도메인을 중심으로 생각하는 습관을 들여야겠다.


넷째주 회고

벌써 4주가 지났다니 시간이 너무 빠르다. 그동안 많은 것들을 배웠는데, 처음 리팩토링 하는것부터 테스트하는것까지 다시한번 쭉 훑어봐야겠다. 개인적으로 새로 알게된 것이 많은데, 그 중에서 코드를 보는 관점을 많이 배운것 같다. 배웠던 것들을 내것으로 완전히 만들기까지 많은 시간이 걸리겠지만, 꼭 복습을 해서 스스로 적용할 수 있도록 해야겠다. 두 강의를 들으면서 스스로 더 공부를 해보고싶다는 자극을 많이 받았다. 의미있는 시간이었다.

댓글을 작성해보세요.

채널톡 아이콘