WEB/JAVA

Test-Driven-Development 테스트 주도 개발

TDD 개발 방식

TDD 는 테스트 코드를 작성한 뒤에 실제 코드를 작성하는 것이다.

테스트가 통과된 코드만을 실제 코드로 작성한다 -> 버그가 줄고 소스가 간결해지며 설계가 개선된다.

 

 - 설계 단계에서 프로그래밍 목적을 미리 정의한다.

 - 무엇을 테스트해야 할지 미리 정의한다.

 - 테스트 코드 작성 도중 발생하는 예외 사항을 테스트 케이스에 추가한다. (설계 개선)

 

 

TDD 프로세스

실패하는 작은 단위 테스트 추가 -> 테스트 통과, 최소한의 코딩 -> 구현 설계 개선, 중복 제거, 리팩토링 , 테스트 통과 유지

 

 

좋은 테스트의 특징

 

  • Fast: 테스트는 빠르게 동작하여 자주 돌릴 수 있어야 한다.
  • Independent: 각각의 테스트는 독립적이며 서로 의존해서는 안된다.
  • Repeatable: 어느 환경에서도 반복 가능해야 한다.
  • Self-Validating: 테스트는 성공 또는 실패로 bool 값으로 결과를 내어 자체적으로 검증되어야 한다.
  • Timely: 테스트는 적시에 즉, 테스트하려는 실제 코드를 구현하기 직전에 구현해야 한다.

 

 

Spring에서의 TDD 프로그래밍 방법 

  • Repository -> Service -> Controller 순서로 개발을 진행한다.
  • Repository 계층의 테스트는 H2와 같은 인메모리 데이터베이스 기반의 통합 테스트로 진행한다.
  • Service 계층의 테스트는 Mockito를 사용해 Repository 계층을 Mock하여 진행한다.
  • Controller 계층의 테스트는 SpringTest의 MockMvc를 사용해 진행한다.

 

 

참고 (완전 좋다 정리 짱짱 ㅜㅜ 🥰)

https://mangkyu.tistory.com/143

 

[TDD] 단위 테스트(Unit Test) 작성의 필요성 (1/3)

1. 단위 테스트 vs 통합 테스트 차이 [ 단위 테스트(Unit Test) ] 단위 테스트(Unit Test)는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다. 여기서 모듈은 애플리케이션에

mangkyu.tistory.com

 

 

상황에 따른 예제 

 

1. 원하는 Item 을 찾을 때 결과값이 존재하지 않을 때 Exception 이 아닌 null (List일 경우 빈 배열)을 반환한다.

  @DisplayName("상품 조회시 상품이 없을때 상태코드 200을 반환한다.")
  @Test
  void getEmptyItem() throws Exception {
  
    //given
    String name = "신라면";

    //when
    final ResultActions actions = mvc.perform(
        get("/item").param("name",name)
            .contentType(MediaType.ALL_VALUE)
            .accept(MediaType.APPLICATION_JSON)).andDo(print());

    //then
    actions.andExpect(status().isOk());

  }

 

2. 추상클래스 테스트하기

상항 : Mapstruct 를 사용하고 있는데 추상 클래스로 변경하여 사용하고 있어 Mapper 테스트 할 때 

	//when
    ItemMapper itemMapper = mock(ItemMapper.class, CALLS_REAL_METHODS);
    when(itemMapper.toDetailDto(item)).thenReturn(itemDetailDto);
    ItemDetailDto result = buyRequestMapper.toDetailDto(item);

 

반응형