diff --git a/seojin/ch06.md b/seojin/ch06.md new file mode 100644 index 0000000..3845791 --- /dev/null +++ b/seojin/ch06.md @@ -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장에서 다룬다. \ No newline at end of file