1장 테스트 주도 개발의 핵심은 무엇인가?
TDD를 왜 해야 할까?
- 시스템 규모를 믿을 수 있는 방식으로 키우고, 예상치 못한 변화에 대처하기 위해 필요하다.
-
주기적인 피드백과 점진적인 개발 방식은 프로젝트와 관련된 사람들이 무엇을 달성해야 하는지 이애하고 그 과정에서 잘못 이해하고 있는 바를 식별하게 한다.
- 피드백
- 가정을 갖고 작성한 코드에 대한 검사할 수 있는 기회
- 피드백 주기 -> 고리형 시스템 : 중첩된 고리 형태 안에서 피드백은 어디서나 오류, 오해를 포착하고 고칠 수 있는 기회를 만든다.
- TDD에서는 데스트를 설계 활동으로 바꾼다.
TDD를 통해 얻을 수 있는 것은 무엇인가?
-
시스템 구현 - 시스템이 동작하는가?
- 컨텍스트를 선명하게 인지하는 동안 오류를 탐지한다.
-
시스템 설계 - 시스템이 잘 구조화돼 있는가?
- 다음 작업에 대한 조건을 명확하게 알 수 있다.
- 느슨하게 결합된 구성 요소를 작성할 수 있게 된다.
- 코드가 하는 일에 대한 실행 가능한 설명이 더해진다.
- 완전한 회귀 스위트가 늘어난다.
- 언제 작업이 충분히 완료 됐는지 알게 되어 과도한 최적화를 하거나 불필요한 기능을 더하지 않게 된다.
- 외부 품질 유지 : 시스템이 고객과 사용자의 요구를 얼마나 잘 충족하는가
- 내부 품질 유지 : 시스템이 개발자와 관리자의 요구를 얼마나 잘 충족하는가 -> 시스템 동작 방식을 안전하고 예상 가능한 상태로 바꿀 수 있게함
TDD 황금률
실패하는 테스트 없이는 새 기능을 작성하지 말라.
리팩터링이란 무엇인가?
기존 코드의 작동 방식을 바꾸지 않은 채로 기존 코드의 내부 구조를 변경하는 것이다.
리팩터링의 핵심은 코드가 구현하는 기능의 표현을 개선해 코드를 좀 더 유지 보수할 수 있게 만드는 것이다.
- 리팩터링의 범위는 이해하기 쉽고 안전할 정도로 규모가 작아야 한다.
통합 테스트, 인수테스트란 무엇인가?
-
통합 테스트
- 변경할 수 없는 코드를 대상으로 코드가 동작하는가?
- 일부 코드가 변경할 수 없는 팀 바깥의 코드를 어떻게 이용할지 검사하는 테스트
- 서드 파티 코드를 대상으로 만든 추상화가 기대한 대로 동작하는지 확인하기 위한 테스트
-
인수 테스트
- 프로젝트를 이끌어 가는 테스트
- 만들고자 하는 기능을 시험하는 테스트
- 전체 시스템이 동작하는가?
- 전 구간 테스트
- 시스템 내부 코드를 가능한 한 직접 호출하지 말고 외부에서 유입되는 시스템과 상호작용하는 테스트
- 시스템과 해당 시스템을 구축하고 배포하는 프로세스를 모두 시험
스터디 내용
-
시스템을 개발하면서 만날 수 있는 어려움.
- 예측한 것과 실제가 다른것
- 예상하지 못한 변경
-
변화에 대처하기 위해 위해서는 우리가 어떤 기술적인 토대가 필요한가?
- 테스트와 깨끗한 코드
- 왜?
- 테스트를 작성하는 것은 잘 구조화된 코드를 생성한다.
- 잘 구조화 된 코드는 깨끗한 코드와 관련이 있다.
- 테스트를 작성하는 것은 설계 활동이다.