Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

요리사에서 IT개발자로

테스트 코드의 중요성 본문

Spring

테스트 코드의 중요성

H.S-Backend 2024. 7. 5. 19:05

 

프로젝트의 규모가 커질수록

간단한 기능 추가 또는 수정시 다른곳에 어떤 영향을 끼칠지 확신할 수 없다.

잘 동작하던 기능에도 이상이 생길 수 있다.

복잡한 기능일수록 내가 구현한 코드가 의도한대로 동작하는 지에 대한 검증이 필요하다.

 

테스트 코드는 모든 비즈니스로직에 대한 테스트 코드를 작성하는 것이 아니다.

 


단위 테스트란

작은 코드 조각(단위)를 검증

빠르게 수행되어야 하고

격리된 방식으로 처리하는 자동화 테스트이다.

 

비즈니스 로직을 외부 의존성으로 부터 격리하여 테스트 하는것.

 

좋은 테스트란

도메인 모데리 및 알고리즘(Dto, Entity, Util클래스)

노력 대비 단위 테스트의 가치가 매우 높다

해당 코드가 복잡하거나 중요한 로직을 수행해서 테스트의 회귀 방지가 향상된다

외부 의존성이 없어 테스트 유지비를 낮추기에 저렴하다.

 

간단한 코드는 테스트할 필요가 전혀없다.

 

컨트롤러는 엔드 투 엔드 테스트가 적합하고 

단위테스트를 적용할 곳이 아니다.


좋은 단위 테스트의 4가지 특성

회귀 방지 : 기능오류를 방지해준다

리팩토링 내성 : 리팩토링을 해도 테스트가 깨지지않는다.

빠른 피드백 : 빠른 테스트 속도

유지 보수성 : 가독성과 재사용성이 좋고 실행되기 쉽게 작성되어야 한다.

@Test
@DisplayName("해당 게시글 존재하지 않는 테스트")
void test_NotFoundPost() {
    given(postRepository.findById(anyLong())).willReturn(Optional.empty());

    //Then
    assertThrows(NotFoundException.class, () ->
        postLikeService.addLikeToPost(1L, userDetails));
}

@Test
@DisplayName("해당 게시물에 이미 좋아요를 누른 경우 실패하는 테스트")
void test_AlreadyPostLike() {
    given(postRepository.findById(1L)).willReturn(Optional.of(post));

    when(postLikeRepository.existsByUserAndPost(any(), any())).thenReturn(true);

    assertThrows(AlreadyException.class, () ->
        postLikeService.addLikeToPost(1L, userDetails));
}

@Test
@DisplayName("본인 게시물의 좋아요를 누르면 실패하는 테스트")
void test_OwnPostsNotLiked() {
    given(postRepository.findById(anyLong())).willReturn(Optional.of(post));

    when(postLikeRepository.existsByUserAndPost(any(), any())).thenReturn(false);

    assertThrows(IllegalArgumentException.class, () ->
        postLikeService.addLikeToPost(1L, userDetails));
}

 

회귀 방지는 높이는 방법은

테스트가 가능한 한 많은 코드를 실행하는 것을 목표로 한다.

 

리팩토링 내성을 높이는 방법은

구현 세부 사항 대신에 최종 결과를 목표로 테스트를 작성하는 것이다.

 

테스트 코드가 모든 기능 오류를 방지해주는 것은 아니다.

 

반응형