[Kotlin] TDD - 테스트 주도 개발
* TDD란? (Test-Driven-Development)
- 테스트 코드를 먼저 작성 후 작성된 테스트코드에 맞춰 제품 코드를 작성하는 프로그래밍 방법
- 짧은 개발 사이클을 반복하는 소프트웨어 개발 프로세스 중 하나
- TDD는 단순한 설계를 장려하고 자신감을 불어 넣어 준다
* TDD의 창시자 켄트 벡은 "프로그램을 작성하기 전에 테스트를 먼저 하라" 라고 했다.
* 위 과정이 기존 개발 과정, 아래 과정이 TDD
TDD가 좋은 이유
- 내 코드 및 개선한/개선할 코드에 자신감을 준다.
- 코드를 이래저래 개선해도 '테스트 코드가 지켜줄거야!' 라는 자신감이 붙는다.
따라서 개선에 대해 두려움이 없어지고, '일단 바꿔보자'라는 생각을 할 수 있게 된다.
즉, 망설임이 없어진다. (= 개발에 속도가 붙는다.)
- 코드를 이래저래 개선해도 '테스트 코드가 지켜줄거야!' 라는 자신감이 붙는다.
- 기능 명세 및 테스트 명세를 대신할 수 있게 된다.
- 테스트명을 Given-When-Then 방법과 같이
테스트 내용을 상세하게 나타낼 수 있는 이름을 사용한다면
그것이 문서 그 자체가 된다.
- 테스트명을 Given-When-Then 방법과 같이
- 테스트 커버리지가 높아진다.
- 테스트 커버리지란 시스템 및 소프트웨어에 대해 충분히 테스트가 되었는지를 나타내는 정도이다.
수행한 테스트가 얼마나 테스트 대상을 커버했는지를 나타낸다.
- 테스트 커버리지란 시스템 및 소프트웨어에 대해 충분히 테스트가 되었는지를 나타내는 정도이다.
- 오버 엔지니어링 방지
- 요구사항에 맞춰 개발하다보니 정말 내가 필요한 만큼만 딱 구현할 수 있다.
- 설계에 대한 피드백이 빠르다.
- 설계가 잘못되었다면 언제 깨달을 수 있을까? - 변경이 일어나거나 사용하기 어려울 때 깨달을 수 있다.
- ex) 테스트를 설계하는데 복잡하고 잘못된 설계를 가지고 있으면 새로운 테스트 코드를 작성하기 점점 더 어려워진다.
그러면 빠르게 설계를 바꾸면 된다.
* 그렇다고 TDD에만 너무 의존하면 테스트 하기만 좋은, 결국 안 좋은 설계가 이루어진다.
TDD가 안좋은 이유
- 적응 기간, 배우는 기간이 오래 걸린다.
- 개발 초기의 개발 기간이 증가한다.
TDD가 어려운 이유
- 적용해본 경험이 없어서
- 설계가 기본이 되기에 (설계 경험이 없어서)
→ 즉 긴 시간동안 축적되는 설계 노하우, 연습, 훈련 등이 기본적으로 필요하기 때문에 어렵다고 할 수 있다.
→ 테스트 작성을 하는 것이 아닌 테스트 주도 개발의 순서와 싸이클을 익혀야하는 것이다
* TDD에 실패하는 이유 (출처: OKKYCON 2018 이규원 - 당신들의 TDD가 실패하는 이유)
1. 코드가 이루고자 하는 가치나 기능을 테스트하기보다 그 기능을 어떻게 구현하고 있는지를 테스트한다.
2. 결국 테스트 케이스들이 구현체와 결합도가 높아진다.
3. 구현체들을 리팩토링하면 결합되어있는 테스트 케이스들이 모두 깨져버린다.
* ex) 화살표를 보면 테스트들이 인터페이스 안에 implementation 내부에 존재하는 구현체들을 테스트하고 있는데,
implementation을 리팩토링하게 되면 테스트들이 모두 깨지게 된다.
결국 우리는 구현체가 아닌 설계 즉, 인터페이스를 테스트해야 한다.
* 이렇게 인터페이스를 테스트하게 되면, 내부에 구현되어 있는 구현체를 아무리 리팩토링 해도 테스트 케이스는 인터페이스를 테스트하기 때문에 테스트 케이스가 깨지지 않는다.
* TDD를 적용하는 방법(이론)
0. 기능을 설계한다.
- 단위테스트를 작성한다.
- 물론, 테스트할 기능이 구현되지 않았으므로 테스트가 실패하는 테스트 코드가 탄생한다.
- 기능을 구현한다.
- 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
- 리펙터링 한다.
- 리팩터링 - 일단 테스트를 통과하게만 하는 와중에 생겨난 모든 중복을 제거한다.
-----
출처: https://www.youtube.com/watch?v=3LMmPXoGI9Q
https://korean-otter.tistory.com/216
'Study > Android' 카테고리의 다른 글
[Compose Study] derivedStateOf (2) | 2024.09.26 |
---|---|
[Compose Study] rememberCoroutineScope (0) | 2024.09.10 |
[Compose Study] Navigation (0) | 2024.09.09 |
[Compose Study] ViewModel에서의 상태 (1) | 2024.09.09 |
[Compose Study] State Hoisting (상태 호이스팅) (0) | 2024.09.08 |