일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Dynamic dispatch
- line messaging api
- enum
- springboot
- Visitor pattern
- 토비의 봄
- ngrok
- mapping
- EntityToDto
- double dispatch
- reflection
- java
- NullPointerException
- linebot
- webhook
- Optional
- Controller
- DtoToEntity
- annotation
- visitor proxy pattern
- 챗봇
- spring
- Modelmapper
- static dispatch
- getOrCreate
- Today
- Total
database by narae :p
테스트 주도 개발의 핵심은 무엇인가? 본문
테스트 주도 개발로 배우는 객체 지향 설계와 실천
1장. 테스트 주도 개발의 핵심은 무엇인가?
1.1 학습 과정으로서의 소프트웨어 개발
소프트웨어 프로젝트 : 사람 + 응용 분야 + 기술 등
미처 예상하지 못한 요소가 많음
개발자들은 구성 요소의 동작 방식을 배우면서 프로젝트를 마무리한다.
: 불확실한 변화를 예측하려면 경험이 늘어남에 따라 불확실성을 해결하는데 도움이 될 프로세스가 필요하다.
1.2. 피드백은 가장 기본적인 도구다
경험에 의거한 피드백을 이용해 시스템과 그 용도에 관해 배운 후, 그 배운바를 시스템에 적용
배포 : 내린 가정을 검사할 기회 => 실제 진행 상황을 측정하고, 오류를 탐지하고 수정하고, 배운 바에 따라 현재 계획을 조정한다.
- 점진적이고 반복적인 개발
: 중첩된 피드백 고리의 집합으로 구성된 프로젝트에는 개발이 점진적이고 반복적이다.
- 점진적인 개발 : 모든 계층과 구성요소를 구축한 다음 시스템을 기능별로 구축한다. 각 기능은 시스템의 모든 관련 부분에 걸쳐 전 구간에 이르는 조각으로 구현한다. 시스템은 언제나 통합된 상태이며 배포할 준비가 되어있다.
- 반복적인 개발 : 계속해서 충분한 상태에 이를 때까지 피드백에 응답해 기능 구현을 다듬는다.
1.3. 변화를 돕는 실천법
- 회귀 오류를 잡아줄 꾸준한 테스트 : 기존 기능을 망가뜨리지 않고도 새 기능을 추가할 수 있다.
- 테스트 자동화 : 구축과 배포, 시스템 버전 변경에 드는 비용을 줄이려면 테스트를 자동화해야 한다.
- 코드 단순화 : 코드 설계를 개선하고 단순화하고, 중복을 제거하고, 코드가 명확하게 자신의 역할을 표현하게끔 코드를 사용할 때마다 꾸준히 코드를 리팩토링해야한다.
- TDD => 테스트를 설계활동으로. 테스트를 사용해 코드에서 하고 싶은 바에 관한 생각을 명확하게 한다.
개발 내내 테스트를 작성한다면 변경에 대한 자신감을 주는 자동화된 회귀테스트를 구축할 수 있다.
1.4. 테스트 주도 개발 간단 정리
TDD
- 과정
- 작성할 때의 장점
- 실행할 때 장점
=> 실패하는 테스트 없이는 새 기능을 작성하지 말라.
- 국부적으로 생각하고 국부적으로 행동하라
- 리팩토링 : 기존 코드의 작동 방식을 바꾸지 않은 채로 기존 코드의 내부 구조를 변경하는 것. 구현하는 기능의 표현을 개선해 코드를 좀 더 유지보수할 수 있게 만드는 것.
- 리팩터링은 이해하기 쉽고 안전할 정도로 규모가 작아야 한다.
1.5. 좀 더 큰 그림
클래스를 대상으로 한 단위 테스트만 작성할 때 문제점
- 아무데서도 호출하지 않거나, 시스템의 나머지 부분과 통합할 수 없는 테스트가 발생
인수 테스트 : 만들고자 하는 기능을 시험하는 테스트
- 기능을 대상으로 작업할 때 작성하려는 코드가 실제로 필요한지 가늠한다.
- 즉, 직접 관련된 코드만 작성한다.
=> 언제 코드 작성을 멈춰야 하는지 = 코드 작성을 어디서 시작해야 하는지
- 실패하는 인수 테스트 작성
- 진척도를 측정하는 수단
- 테스트 스위트가 증가하면 시스템을 변경할 때 회귀 실패에서 보호받을 수 있다.
- 실패하는 단위테스트 작성 -> 테스트 통과 -> 리팩터링
- 코드 품질 유지
1.6. 전 구간 테스트
인수테스트에서는 시스템 내부 코드를 가능한 한 직접 호출하지 말고 시스템 전 구간을 시험해야 한다.
: 외부에서 유입되는 시스템하고만 상호 작용한다.
1.7. 테스트의 수준
- 인수 테스트 : 전체 시스템이 동작하는가?
- 통합 테스트 : 변경할 수 없는 코드를 대상으로 코드가 동작하는가?
- 단위 테스트 : 객체가 제대로 동작하는가? 객체를 이용하기가 편리한가?
1.8. 외부 품질과 내부 품질
- 외부 품질 : 시스템이 고객과 사용자의 요구를 얼마나 잘 충족하는가(기능, 신뢰성, 가용성, 응답성 등)
- 내부 품질 : 시스템이 개발자와 관리자의 요구를 얼마나 잘 충족하는가(이해하기 쉬운가, 변경하기 쉬운가 등) => 시스템의 동작 방식을 안전하고 예상 가능한 상태로 바꿀 수 있게 만드는 것이 중요
- 전구간 테스트
- 단위 테스트
- 결합도 : 한 변경이 다른 것의 변경을 강제한다면 요소들이 결합된 상태
- 응집도 : 해당 요소의 책임이 의미 있는 단위를 형성하는지 나타내는 척도
'테스트' 카테고리의 다른 글
테스트 주도 개발 주기의 유지 (0) | 2021.12.05 |
---|---|
테스트 주도 주기 시작 (0) | 2021.12.05 |
도구 소개 (0) | 2021.12.05 |
객체를 활용한 테스트 주도 개발 (0) | 2021.12.05 |