TDD는 기본적으로 유닛 테스팅 방식이다.
이를 생각하면서 아래 글을 읽어보자.
좋은 테스팅을 하기 위한 5가지 'FIRST' 규칙
1. Fast : 테스트는 빠르게 동작하여 자주 돌릴 수 있어야 한다.
2. Independent : 각각의 테스트는 독립적이며 서로 의존해서는 안된다.
3. Repeatable : 어떤 환경에서도 반복 가능해야 한다.
4. Self-Validating : 테스트는 성공 또는 실패로 boolean 값으로 결과를 내어 자체적으로 검증되어야 한다. 즉, 실패, 성공이 애매한 상황이 없어야 하고 코드를 작성하는 사람이 출력이나 로그를 통해서 수동적으로 결과를 확인하는 것이 아니라 자체적으로 결과가 나와야 한다.
5. Timely : 유닛 테스트는 적절한 때에 작성되어야 한다. 즉, 실제 코드를 작성하기 바로 전에 작성해야 한다.
TDD 개발 순서
1. 실패하는 작은 단위 테스트를 작성한다.
- 처음에는 컴파일조차 되지 않을 수 있다.
2. 빨리 테스트를 통과하기 위해 프로덕션 코드를 작성한다.
- 이를 위해 정답이 아닌 가짜 구현 등을 작성할 수도 있다.
3. 테스트 코드를 작성한다.
- 실패 테스트가 없을 경우에만 성공 테스트를 작성한다.
4. 새로운 테스트를 통과하기 위해 프로덕션 코드를 추가 또는 수정한다.
5. 1~4 단계를 반복하여 실패/성공의 모든 테스트 케이스를 작성한다.
6. 개발된 코드들에 대해 모든 중복을 제거하며 리팩토링한다.
TDD 접근 방법
1. 가짜로 구현하기
- 최대한 빨리 테스트를 통과하기 위해 정답이 아닌 가짜 정답을 구현하는 방법
- 가짜 정답이란 실제 올바르게 구현된 척하는 코드를 말하는 것 같다.
- 실패하는 테스트를 가장 빠르게 구현하는 방법은 아무 값이나 일단 return 하는 것이다.
- 그리고 테스트가 통과하면 단계적으로 상수를 변수로 바꿔준다.
2. 삼각측량법
- 값이 다른 여러 테스트를 작성하고, 이를 일반화하여 정답을 구현하는 방법
3. 정답을 바로 구현하는 방법
가짜로 구현하기
- 가짜 구현으로 연습을 많이 해두면, 복잡한 코드일 경우 단계를 잘게 쪼개서 TDD로 문제없이 개발하는 능력을 갖출 수 있다.
- 즉, 하나의 구체적인 예에서 일반화 함으로써 불필요한 고민으로 혼동되는 일을 예방할 수 있다.
- 아래와 같이 곱하기 테스트를 작성하였다고 해보자.
@Test public void 곱하기테스트() { // given // when final int result = multiply(2, 3); // then assertThat(result).isEqualTo(6); }
위 테스트를 가장 빠르게 통과하는 방법은 6을 return 하는 것이다.public int multiply(final int num1, final int num2) { return 6; }
삼각측량법
- 테스트 주도로 추상화된 과정을 일반화하는 과정이다.
- 테스트 예시가 2개 이상일 때만 추상화를 해야 한다.
@Test public void 곱하기테스트() { // given // when final int result1 = multiply(2, 3); final int result2 = multiply(4, 7); // then assertThat(result1).isEqualTo(6); assertThat(result2).isEqualTo(28); }
정답 바로 구현하기
- 곱하기와 같이 쉬운 문제는 바로 진짜 구현을 해도 괜찮다.
public int multiply(final int num1, final int num2) { return num1 * num2; }
Spring에서 TDD 개발 방법
1. Controller부터 개발하기
- Controller -> Service -> Repository 순서로 개발하는 방법
2. Repository부터 개발하기
- Repository -> Service -> Controller 순서로 개발하는 방법
- Repository는 다른 계층에 대한 의존성이 거의 없기 때문에 작성하기가 편리하다.
어떤 순서를 채택하든 아래와 같은 방식으로 진행한다.
Repository 계층 : H2와 같은 In-Memory DB 기반의 통합 테스트로 진행
Service 계층 : Mockito를 사용해 Repository 계층을 Mock 하여 진행
Controller 계층 : SpringTest의 MockMvc를 사용해 진행
'개발 지식' 카테고리의 다른 글
Encryption(암호화), Encoding(인코딩) 차이점 (0) | 2024.03.19 |
---|---|
[TDD 00] TDD란 무엇일까? (0) | 2023.04.24 |