-
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
1 parent
e661a52
commit 9c394d9
Showing
1 changed file
with
102 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,102 @@ | ||
## 기능에서의 상황 | ||
|
||
- 기능은 주어진 상황에 따라 다르게 동작한다. | ||
- 예를 들어 숫자 야구 게임이 있다. 같은 예측이라도 정답 숫자에 따라 결과가 달라진다. | ||
- ex) 예측한 숫자가 456일 경우, 정답 숫자가 123인 경우와 456인 경우가 다름 | ||
|
||
**어떤 상황이 실행 결과에 영향을 줄 수 있는지 찾아야한다.** | ||
|
||
## 테스트 코드의 구성 요소 : 상황, 실행, 결과 확인 | ||
|
||
- 기능은 상황에 따라 결과가 달라진다. | ||
|
||
테스트 코드의 구성은 크게 3가지이다. | ||
|
||
1. 상황 - given | ||
2. 실행 - when | ||
3. 결과 - then | ||
|
||
### 상황 설정 방법 1 | ||
|
||
- 위의 숫자 야구 게임 구현에 대한 test는 다음과 같이 구성해볼 수 있다. 아래는 정답과 예측값이 일치하는 경우이다. | ||
|
||
```java | ||
@Test | ||
public void exactMatch() { | ||
// given | ||
BaseballGame game = new BaseballGame("456"); | ||
|
||
// when | ||
Score score = game.guess("456"); | ||
|
||
// then | ||
assertEquals(3, score.strikes()); | ||
assertEquals(0, score.balls()); | ||
} | ||
``` | ||
|
||
### 상황 설정 방법 2 - @BeforeEach 사용 | ||
|
||
- @BeforeEach를 사용하면 메소드마다 객체를 생성하지 않아도 된다. | ||
|
||
```java | ||
private BaseballGame game; | ||
|
||
@BeforeEach | ||
void givenGame() { | ||
game = new BaseballGame("456"); | ||
} | ||
|
||
@Test | ||
public void exactMatch() { | ||
... 생략 | ||
``` | ||
|
||
## 외부 상황과 외부 결과 | ||
|
||
- 상황 설정이 테스트 대상으로 국한되는 것은 아니다. | ||
- 아래 코드처럼 파일이 존재하지 않는 상황의 결과도 확인해야한다. | ||
|
||
```java | ||
File datafile = new File("data.txt"); | ||
long sum = MathUtils.sum(datafile); | ||
``` | ||
|
||
- 가장 확실한 방법은 명시적으로 파일이 없는 상황을 만드는 것이다. | ||
- 아래 코드는 해당 경로에 파일이 존재하는지 검사하고, 존재할 경우 해당 파일을 제거한다. | ||
- 반대로 파일을 미리 생성함으로써 존재하는 상황을 만들 수도 있다. | ||
|
||
```java | ||
@Test | ||
void noDataFile_Then_Exception() { | ||
givenNoFile("file.txt"); | ||
|
||
File datafile = new File("file.txt"); | ||
|
||
assertThrows(FileNotFoundException.class, | ||
() -> MathUtils.sum(datafile)); | ||
} | ||
|
||
private void givenNoFile (String path) { | ||
File file = new File(path); | ||
if (file.exists()) { | ||
boolean deleted = file.delete(); | ||
if (!deleted) { | ||
throw new RuntimeException("fail givenNoFile" +path); | ||
} | ||
} | ||
} | ||
``` | ||
|
||
## 외부 상태가 테스트 결과에 영향을 주지 않게 하기 | ||
|
||
- 테스트는 언제 실행해도 항상 정상적으로 동작하는 것이 중요하다. | ||
- 회원 중복검사 후 회원가입 test의 경우, DB 데이터에 따라 성공하기도, 실패하기도 한다. | ||
- 테스트 실행 전 외부를 원하는 상태로 만들거나, 실행 후 외부 상태를 원래대로 되돌려놔야한다. | ||
|
||
## 외부 상태와 테스트 어려움 | ||
|
||
- 테스트 대상이 아닌 외부 요인은 테스트 코드에서 검증하기 힘들다. | ||
- ex) REST API 서버에 연결할 수 없는 상황이나, 응답을 5초 이내에 받지 못하는 상황 | ||
|
||
이럴 경우 대역을 사용하면 되는데, 이에 관한 내용은 7장에서 다룬다. |