개요
우테코 사다리 타기 미션을 수행하기에 앞서 TDD의 개념에 대해 수강한 내용을 정리하기로 했다
TDD
프로덕션 코드보다 테스트코드를 먼저 구현하는 개념이다. 따라서 test first development라고도 한다. 프로그래밍 의사결정과 피드백 사이의 간극을 의식하고 이를 제어하는 기술이다. TDD는 테스트 기술 아니라 분석 기술, 혹은 설계 기술이다...고 하는데 사실 이렇게 말하면 뭔 소린지 잘 모르겠다...직접 진행을 하면서 이 개념을 확인해보자
TDD 작업방식 및 TDD를 하는 이유
ex)
class Lotto {
//프로덕션 코드 생성
}
class LottoTest {
@Test
void min1Max45(){
new Lotto(0) //실패
new Lotto(1) //성공
new Lotto(45) // 성공
new Lotto(46) //실패
}
}
ex)
class Lotto {
public Lotto(final int i) {
throw new IllegalArgumentException();
}
}
class LottoTest {
@Test
void min1Max45(){
//실패 -> 성공
assertThrows(IllegalArgumentException.class, () -> new Lotto(0));
new Lotto(1) //성공
new Lotto(45) // 성공
new Lotto(46) //실패
}
}
ex)
class Lotto {
public Lotto(final int i) {
if (i == 0) {
throw new IllegalArgumentException();
}
}
}
class LottoTest {
@Test
void 0은_로또번호_아님(){
assertThrows(IllegalArgumentException.class, () -> new Lotto(0));
}
@Test
void 1은_로또번호임(){
assertDoesNotThrows(IllegalArgumentException.class, () -> new Lotto(1));
}
}
ex)
class Lotto {
public Lotto(final int i) {
if (i == 0 || i == 46) {
throw new IllegalArgumentException();
}
}
}
class LottoTest {
@Test
void 0은_로또번호_아님(){
assertThrows(IllegalArgumentException.class, () -> new Lotto(0));
}
@Test
void 1은_로또번호임(){
assertDoesNotThrows(IllegalArgumentException.class, () -> new Lotto(1));
}
@Test
void 45는_로또번호임(){
assertDoesNotThrows(IllegalArgumentException.class, () -> new Lotto(45));
}
@Test
void 46은_로또번호_아님(){
assertThrows(IllegalArgumentException.class, () -> new Lotto(46));
}
}
-> 가장 빠르게 문제를 해결하라. 실패를 성공으로 만들어라
그런데 애초에 그냥 1~45 범위를 잡고 예외처리 하면 될 것을 왜 이렇게 귀찮게 할까? TDD는 왜 그렇게 하라는 걸까?
위에 올라온 TDD의 정의를 다시 보자
TDD는 프로그래밍 의사결정과 피드백 사이의 간극을 의식하고 이를 제어하는 기술이다
-> 문제와 실패를 해결을 하는 과정에서 도메인의 특징을 알게 된다. 도메인에 익숙해지고 개념이 명확해지고, 설계가 확실히 될 때 까지 이런 방법으로 진행한다. 이 타이밍이 됐다고 생각하면 조금 빠르게 프로덕션을 구현한다.
-> 그렇기 때문에 아래와 같은 TDD의 정의가 나온 것이다
TDD는 테스트 기술 아니라 분석 기술, 혹은 설계 기술이다
-> 프로덕션 코드를 테스트하는 것이 아니다. 테스트를 실패하고 성공시키도록 하면서 도메인을 분석하고, 설계하며, 제어한다.
결국 TDD를 하는 이유는 다음 결론에 도달한다
전체 설계를 한번에 할 수 없다. TDD를 하면서 조금씩 설계를 그려 나가자. 설계가 없이 진행하는 것이 아니라. 머릿속으로 어느 정도만 설계를 하고 시작하자
TDD를 쓰는 기준 정하기
TDD를 모든 개발 과정에 적용하기란 어렵다. 따라서 본인이 TDD를 쓰는 기준을 정하는 것이 좋다. 중요성을 잘 고려해 기준을 세우자
ex)
"제한된 시간과 자원 안에서 얼마만큼 할 것인가를 끊임없이 선택해야 한다"라고 한 코치님이 말씀해 주셨다
TDD 사이클
테스트 실패 -> 테스트 성공하도록 프로덕션 구현 -> 프로덕션/테스트 리팩토링 -> 테스트 실패(반복)
TDD 원칙
TDD 진짜 진짜 왜 해야하나????
조금 지루한 대신, 문제가 생길 수 있는 불안함을 깨끗하게 해소하자!
미션이 끝나고 생각해볼 점