목차

차례
옮긴이의 글 XII
추천의 글 XIII
지은이의 글 XIV
감사의 글 XVIII

1부 서론 1
1장 테스트 주도 개발의 핵심은 무엇인가? 3
1.1 학습 과정으로서의 소프트웨어 개발 3
1.2 피드백은 가장 기본적인 도구다 4
1.3 변화를 돕는 실천법 5
1.4 테스트 주도 개발 간단 정리 6
1.5 좀 더 큰 그림 8
1.6 전 구간 테스트 9
1.7 테스트의 수준 11
1.8 외부 품질과 내부 품질 12

2장 객체를 활용한 테스트 주도 개발 15
2.1 객체망 15
2.2 값과 객체 16
2.3 메시지를 따르라 17
2.4 묻지 말고 말하라 19
2.5 그래도 가끔은 물어라 20
2.6 협력 객체의 단위 테스트 21
2.7 목 객체를 활용한 TDD 지원 22

3장 도구 소개 25
3.1 이미 아는 내용이라면 넘어가도 좋다 25
3.2 간략한 JUnit 4 소개 25
3.3 햄크레스트 매처와 assertThat() 29
3.4 jMock2: 목 객체 30

2부 테스트 주도 개발 과정 35
4장 테스트 주도 주기 시작 37
4.1 우선 동작하는 골격을 대상으로 테스트하라 38
4.2 동작하는 골격의 외형 결정 40
4.3 피드백 소스 구축 42
4.4 불확실성은 일찍 드러내라 43

5장 테스트 주도 개발 주기의 유지 47
5.1 각 기능을 인수 테스트로 시작하라 47
5.2 회귀를 포착하는 테스트와 진행 상황을 측정하는 테스트를 분리하라 49
5.3 테스트를 가장 간단한 성공 케이스로 시작하라 49
5.4 읽고 싶어 할 테스트를 작성하라 50
5.5 테스트가 실패하는 것을 지켜보라 51
5.6 입력에서 출력 순서로 개발하라 52
5.7 메서드가 아닌 행위를 단위 테스트하라 52
5.8 테스트에 귀를 기울이라 54
5.9 주기의 미세 조정 55

6장 객체 지향 스타일 57
6.1 유지 보수성을 고려한 설계 58
6.2 내부 대 이웃 61
6.3 단일 책임 원칙 62
6.4 객체 이웃의 유형 63
6.5 전체는 부분의 합보다 단순해야 한다 65
6.6 콘텍스트 독립성 66
6.7 올바른 정보 감추기 67
6.8 우리 견해가 반영된 관점 68

7장 객체 지향 설계의 달성 69
7.1 테스트를 먼저 작성하는 것이 설계에 어떻게 도움이 되는가 69
7.2 분류보다 의사소통 70
7.3 값 타입 71
7.4 객체는 어디에서 오는가? 73
7.5 인터페이스로 관계를 식별하라 76
7.6 인터페이스도 리팩터링하라 77
7.7 객체를 구성해 시스템의 행위를 기술하라 78
7.8 고수준 프로그래밍을 위한 대비 79
7.9 그럼 클래스는? 81

8장 서드 파티 코드를 기반으로 한 개발 83
8.1 소유한 타입에 대해서만 목 객체를 적용하라 83
8.2 통합 테스트에서 애플리케이션 객체에 목 객체를 적용하라 86

3부 동작하는 예제 87
9장 경매 스나이퍼 개발 의뢰 89
9.1 맨 처음부터 시작하기 89
9.2 경매와의 상호 작용 92
9.3 안전하게 진행하기 94
9.4 이건 진짜가 아니야 96

10장 동작하는 골격 99
10.1 골격 사용 준비 99
10.2 최초 테스트 100
10.3 몇 가지 초기 선택 103

11장 첫 테스트 통과하기 107
11.1 테스트 도구 구축 107
11.2 테스트 실패와 통과 114
11.3 필요한 최소한의 것 122
12장 입찰 준비 125
12.1 시장 소개 125
12.2 입찰 테스트 126
12.3 AuctionMessageTranslator 133
12.4 가격 메시지 분석 139
12.5 마무리 143

13장 스나이퍼가 입찰하다 145
13.1 AuctionSniper 도입 145
13.2 입찰 전송 148
13.3 구현 정리 154
13.4 결정을 미루라 158
13.5 창발적 설계 159

14장 스나이퍼가 경매에서 낙찰하다 161
14.1 우선 실패하는 테스트를 작성한다 161
14.2 누가 입찰자에 대해 알고 있는가? 162
14.3 스나이퍼는 할 말이 더 있다 165
14.4 스나이퍼가 일부 상태를 획득하다 166
14.5 스나이퍼가 낙찰하다 169
14.6 꾸준하게 진행하기 171

15장 실제 사용자 인터페이스를 향해 173
15.1 좀 더 현실적인 구현 173
15.2 가격 세부 사항 표시 176
15.3 스나이퍼 이벤트의 단순화 184
15.4 완수 189
15.5 마지막 손질 194
15.6 고찰 197

16장 여러 품목에 대한 스나이핑 201
16.1 여러 품목에 대한 테스트 201
16.2 사용자 인터페이스를 통한 항목 추가 210
16.3 고찰 217

17장 Main 분석 219
17.1 역할 찾기 219
17.2 채팅 추출 220
17.3 연결 추출 224
17.4 SnipersTableModel 추출 225
17.5 고찰 230

18장 세부 사항 처리 235
18.1 좀 더 유용한 애플리케이션 235
18.2 충분할 때 멈추라 236
18.3 고찰 243

19장 실패 처리 247
19.1 뭔가 제대로 동작하지 않는다면? 247
19.2 실패 감지 249
19.3 실패 보여주기 251
19.4 스나이퍼 연결 끊기 252
19.5 실패 기록 254
19.6 고찰 259

4부 지속 가능한 테스트 주도 개발 261
20장 테스트에 귀 기울이기 263
20.1 대체할 수 없는 객체에 대해 목 객체를 적용해야 한다(마법을 쓰지 않고) 264
20.2 로깅은 기능이다 268
20.3 구상 클래스에 대한 목 객체 적용 271
20.4 값에 목 객체를 적용하지 말라 273
20.5 비대한 생성자 274
20.6 혼동되는 객체 277
20.7 너무 많은 의존성 278
20.8 너무 많은 예상 구문 279
20.9 테스트가 우리에게 말해주는 것(여러분이 귀 기울인다면) 281

21장 테스트 가독성 285
21.1 테스트 이름은 기능을 기술한다 286
21.2 정규 테스트 구조 289
21.3 테스트 코드의 능률화 291
21.4 단정과 예상 구문 294
21.5 리터럴과 변수 295
22장 복잡한 테스트 데이터 만들기 297
22.1 테스트 데이터 빌더 298
22.2 비슷한 객체 생성 300
22.3 빌더 조합 301
22.4 팩터리 메서드를 이용한 도메인 모델 강조 302
22.5 사용 시점에서 중복 없애기 303
22.6 의사소통이 우선이다 305

23장 테스트 진단 307
23.1 실패하는 설계 307
23.2 작고, 문제에 집중하고, 이름을 잘 지은 테스트 308
23.3 설명력 있는 단정 메시지 308
23.4 매처를 활용한 세부 사항 강조 309
23.5 자기 서술적인 값 309
23.6 명확하게 가공된 값 310
23.7 추적자 객체 311
23.8 예상이 충족됐음을 명시적으로 단정하라 312
23.9 진단은 일급 기능이다 312

24장 테스트 유연성 315
24.1 표현이 아닌 정보를 위한 테스트 316
24.2 정확한 단정 318
24.3 정확한 예상 구문 320
24.4 ‘실험용 쥐’ 객체 328

5부 고급 주제 331
25장 영속성 테스트 333
25.1 들어가며 333
25.2 영속화 상태에 영향을 주는 테스트 격리 335
25.3 테스트 트랜잭션 경계를 명시적으로 만들기 336
25.4 영속성 연산을 수행하는 객체에 대한 테스트 339
25.5 영속화 가능한 객체 테스트하기 342
25.6 하지만 데이터베이스는 느리다! 346

26장 단위 테스트와 스레드 347
26.1 기능과 동시성 정책의 분리 348
26.2 동기화에 대한 단위 테스트 353
26.3 수동적인 객체에 대한 부하 테스트 358
26.4 백그라운드 스레드를 이용한 테스트 스레드 동기화 359
26.5 단위 부하 테스트의 한계 361

27장 비동기 코드 테스트 363
27.1 샘플링 또는 대기 364
27.2 두 가지 구현 367
27.3 제어하기 어려운 테스트 372
27.4 갱신 내역 분실 373
27.5 아무런 효과가 없는 행동에 대한 테스트 375
27.6 동기화와 단정 구별 376
27.7 이벤트 소스의 외부화 376

후기 목 객체의 간략한 역사 379
부록 A jMock2 정리 노트 385
부록 B 햄크레스트 매처 작성 395

참고 문헌 398
찾아보기 402