-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
115 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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를 구현한다. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters