Skip to content

Commit

Permalink
docs: 3. TDD
Browse files Browse the repository at this point in the history
  • Loading branch information
jmxx219 committed Apr 18, 2024
1 parent 030f39d commit 6709ff7
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 0 deletions.
101 changes: 101 additions & 0 deletions Testing/3. TDD.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
## TDD(Test Driven Development)

> [TDD 참고](https://github.com/jmxx219/CS-Study/blob/main/etc/TDD.md)
<br>

- 프로덕션 코드보다 테스트 코드를 먼저 작성하여 테스트가 구현 과정을 주도하도록 하는 방법론
- 지금까지는 프로덕션 코드를 먼저 만들고 테스트 코드를 작성해왔는데 이 순서를 변경하는 것
- TDD 개발 주기
- `RED` : 실패하는 테스트 작성
- 아직 구현부(프로덕션 코드)가 없기 떄문에 실패함
- `GREEN` : 테스트를 통과하기 위한 최소한의 코딩
- 빠른 시일 내에 구현부를 작성하여 통과하기
- `REFACTOR` : 구현 코드 개선. 테스트 통과 유지
- 구현 코드 개선 및 테스트 통과 유지

<br>

### TDD로 테스트 만들기

1. 테스트 코드를 먼저 작성한다.
```Java
class CafeKioskTest{
...
@Test
void calclulateTotalPrice(){
CafeKiosk cafeKiosk = new CafeKiosk();
Americano americano = new Americano();
Latte latte = new Latte();

cafeKiosk.add(americano);
cafeKiosk.add(latte);

int totalPrice = cafeKiosk.calculateTotalPrice();

assertThat(totalPrice).isEqualTo(8500);
}
}
```
2. 메서드가 컴파일 되도록 최소한의 코드만 작성한다.
```Java
public class CafeKiosk{
// 1단계: 최소한의 컴파일이 되도록 최소한의 코드 작성
public int caculateTotalPrice(){
return 0;
}
}
```
3. 빨간불이 뜬다. → `RED` 상태
4. 빠른 시간 내에 초록불이 뜨게 만든다. → `GREEN` 상태
```Java
public class CafeKiosk{
// 2단계: 빠른 시간 안에 초록불이 뜨게 만들기
public int caculateTotalPrice(){
return 8500;
}
}
```
5. 리팩토링을 한다. → `REFACTOR` 하기
```Java
public class CafeKiosk{
// 3단계: 리팩토링 하기
public int caculateTotalPrice(){
int totalPrice = 0;
for(Beverage beverage : beverage)
totalPrice += beverage.getPrice();
return totalPrice;
}
}
```
- 구현분를 완전히 개편하여도 테스트를 통과한다. → 과감한 리팩토링 가능
```Java
public class CafeKiosk{
public int caculateTotalPrice() {
return beverages.stream().mapToInt(b -> b.getPrice()).sum();
}
}
```


<br/>

#### 선 기능 구현 후, 테스트 작성의 단점
- 테스트 자체의 누락 가능성
- 특정 테스트 케이스(해피 케이스)만 검증할 가능성
- 잘못된 구현을 다소 늦게 발견할 가능성


<br/>

#### 선 테스트 작성 후, 기능 구현의 장점

- 복잡도가 낮은, 테스트 가능한 코드로 구현할 수 있게 한다.
- 테스트를 먼저 작성하면, 테스트하기 위한 구조를 고민하게 되어 테스트하기 어려운 영역을 미리 분리할 수 있다.
- 쉽게 발견하기 어려운 엣지 케이스를 놓치지 않게 해준다.
- 구현에 대한 빠른 피드백을 받을 수 있다.
- 과감한 리팩토링이 가능해진다.


> TDD는 클라이언트 관점에서 우리의 프로덕션 코드를 피드백해주는 Test Driven
> `RED` → `GREEN` → `REFACTOR`를 이용하여 TDD를 구현한다.
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,20 @@ void clear() {
assertThat(cafeKiosk.getBeverages()).isEmpty();
}

@Test
void calculateTotalPrice(){
CafeKiosk cafeKiosk = new CafeKiosk();
Americano americano = new Americano();
Latte latte = new Latte();

cafeKiosk.add(americano);
cafeKiosk.add(latte);

int totalPrice = cafeKiosk.calculateTotalPrice();

assertThat(totalPrice).isEqualTo(8500);
}

@Test
void createOrder() {
CafeKiosk cafeKiosk = new CafeKiosk();
Expand Down

0 comments on commit 6709ff7

Please sign in to comment.