TDD로 개발할 때 먼저 해야 할 것은 기능을 검증하는 테스트 코드를 작성하는 것이다.
덧셈 기능을 검증하기 위한 테스트 코드를 작성하자.
테스트 코드 작성
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
public class CalculatorTest {
@DisplayName("덧셈 기능 테스트")
@Test
void plus() {
int result = CalCulator.plus(1, 2);
assertThat(3).isEqualTo(result);
}
}
이 코드를 작성하면 12행에서 Calculator 클래스가 없다는 컴파일 에러가 발생한다.
아직 Calculator 클래스를 작성하지 않았으니 당연히 컴파일 에러가 발생해야 한다.
컴파일 에러를 없애기 전에 코드를 살펴보자.
- @Test 애노테이션을 붙인 plus() 메서드를 테스트 메서드로 인식한다.
테스트 메서드는 기능을 검증하는 코드를 담고 있는 메서드이다. - 12행: 계산 기능을 실행하는 코드를 작성한다.
- 13행: 계산 기능을 실행한 결과가 기대한 값인지 검증한다.
isEqaulTo 메서드는 인자로 받은 두 값이 동일한지 비교한다.
이때 첫 번째 인자는 기대한 값이고 두 번째 인자는 실제 값이다.
비교한 결과 두 값이 동일하지 않으면 AssertionFailedError가 발생한다.
CalculatroTest 클래스 생성
덧셈 기능이 올바르게 동작하는지 검증하는 테스트 코드를 작성했지만, 아직 실행할 수는 없다.
컴파일 에러가 나기 때문이다.
컴파일 에러를 없애기 위해 일단 Calculator 클래스를 생성하고 0을 리턴하는 plus() 메서드를 추가하자.
public class Calculator {
public static int plus(int a1, int a2) {
return 0;
}
}
plus() 메서드를 당장 구현하고 싶겠지만 잠시만 참고 CalculatorTest 클래스를 실행하자.
실행 결과는 다음과 같다.
결과를 보면 13행에서 에러가 발생했다.
기대 값: 3, 실제 값: 0이어서 에러가 발생했음을 의미한다.
plus() 메서드 구현(1)
public class Calculator {
public static int plus(int a1, int a2) {
return 3;
}
}
그냥 a1과 a2를 더하는 코드를 바로 작성하면 될 것을 쓸데없이 3을 리턴하는 코드를 작성한다.
처음 TDD를 젒할 때는 이런 작은 단계를 차근차근 밟아 나가야 한다.
그렇지 않으면 TDD를 몸에 익히는데 어려움을 겪을 수 있다.
코드를 수정했으니 다시 테스트 코드를 실행하자.
검증 코드 추가
테스트에 통과했으니 덧셈 검증 코드를 하나 더 추가하자.
@Test
void plus() {
int sum = Calculator.plus(1, 2);
assertThat(3).isEqualTo(sum);
assertThat(5).isEqualTo(Calculator.plus(4, 1));
}
경우의 수를 하나 더 추가했다. 테스트를 실행호보고 통과되는지 확인하자.
새로 추가한 코드 때문에 테스트를 통과하지 못한다.
테스트를 통과시켜보자. 처음에는 Calculator.plus() 메서드가 단순히 3을 리턴해서 테스트를 통과시켰는데 지금은 그럴 수 없다.
1 + 2와 4 + 1을 모드 통과시키도록 코드를 수정해야 한다.
plus() 메서드 구현(2)
다음과 같이 테스트를 통과할 만큼 코드를 수정해 볼 수 있다.
public class Calculator {
public static int plus(int a1, int a2) {
if (a1 == 4 && a2 == 1) {
return 5;
}
return 3;
}
}
구현 로직이 단순하지 않을 때는 이렇게 점진적으로 구현을 완성해 나가는데 덧셈 예는 단순하므로 plus() 메서드 구현을 수정한다.
public class Calculator {
public static int plus(int a1, int a2) {
return a1 + a2; // return 3; 코드를 수정함
}
}
다시 CalculatorTest를 실행하면 테스트에 통과하는 것을 확인할 수 있다.
폴더 수정
덧셈 기능을 완료했는데 아직 하나가 남았다. 코드 경로를 유심히 보면 Calculator.java 파일이 src/test/java 소스 폴더에 위치한 것을 알 수 있다.
Calculator 클래스를 src/main/java 소스 폴더에 만들어도 되지만 아직 완성된 기능이 아니어서 test 소스 폴더에 넣었다.
덧셈 기능을 완료했으므로 Calculator 클래스를 src/main/java 소스 폴더로 이동시켜서 배포 대상에 포함시킨다.
테스트에 통고화는지 다시 한번 확인한다.
src/test/java 소스 폴더는 배포 대상이 아니므로 src/test/java 폴더에 코드르 만들면 완성되지 않은 코드가 배포되는 것을 방지하> > 는 효과과있다.
지금까지 간단한 덧셈 기능을 TDD로 구현해 봤다. 너무 간단한 기능이라 왜 이렇게까지 해야하는지 의구심이 들겠지만
처음 TDD를 배울 때는 복잡한 기능보다는 단순한 기능이 TDD의 기본 흐름을 느끼기에 적당하다고 생각해 덧셈 기능을 예로 들었다.
테스트 코드 작성 순서
앞서 TDD는 기능을 검증하는 테스트 코드를 먼저 만든다고 했다.
덧셈 예제에서는 덧셈 기능을 검증하는 테스트 코드를 먼저 작성했다.
이 과정에서 테스트 대상이 될 클래스 이름, 메서드 이름, 파라미터 개수, 리턴 타입을 고민했다.
또한, 새로운 객체를 생설할지 아니면 정적 메서드로 구현할지 등을 함께 고민했다.
이런 고민 과정은 실제 코드를 설계하는 과정과 유사하다.
테스트 코드를 작성한 뒤에는 컴파일 오류를 없애는 데 필요한 클래스와 메서드를 작성했다.
그런 뒤 바로 테스트를 실행했고 테스트에 실패했다.
실패한 이유를 확인하고 단순히 3을 리턴해서 테스트를 통과할 만큼만 코드를 구현했다.
실패한 테스트를 통과시킨 뒤에 새로운 테스트를 추가했고 다시 그 테스트를 통과시키기 위한 코드를 작성했다.
이런 식으로TDD는 테스트를 먼저 작성하고 테스트에 실패하면 테스트를 통과시킬 만큼 코드를 추가하는 과정을 반복하면서 점진적으로 기능을 완성해 나간다.
'Book Review > 테스트 주도개발 시작하기' 카테고리의 다른 글
[테스트 주도개발 시작하기] Chapter1. TDD 시작(6): 암호 검사기 (0) | 2023.04.15 |
---|---|
[테스트 주도개발 시작하기] Chapter1. TDD 시작(5): 암호 검사기 (0) | 2023.04.15 |
[테스트 주도개발 시작하기] Chapter1. TDD 시작(4): 암호 검사기 (0) | 2023.04.11 |
[테스트 주도개발 시작하기] Chapter1. TDD 시작(3): 암호 검사기 (0) | 2023.04.07 |
[테스트 주도개발 시작하기] Chapter1. TDD 시작(2): 암호 검사기 (0) | 2023.04.04 |