Skip to content

Commit

Permalink
add : ch06 #16
Browse files Browse the repository at this point in the history
  • Loading branch information
PicturePark1101 committed May 7, 2024
1 parent e661a52 commit 9c394d9
Showing 1 changed file with 102 additions and 0 deletions.
102 changes: 102 additions & 0 deletions seojin/ch06.md
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장에서 다룬다.

0 comments on commit 9c394d9

Please sign in to comment.