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);
반응형
'WEB > JAVA' 카테고리의 다른 글
나만 어려운 예외처리 (0) | 2022.05.19 |
---|---|
Enum Type 에서 Function Interface 활용 (0) | 2022.04.01 |
Java 8 Interface - default 메서드, static 메서드 (0) | 2022.03.23 |
[MapStruct] 내가 찾아 쓰려고 정리한 글 (0) | 2022.03.16 |
[Lombok] Difference Between @Value and @Data (0) | 2022.03.11 |