오늘은 애자일의 방법중의 하나인 TDD에 대해서 공부해 봤어요 !
먼저 TDD(test driven development)란 테스트 주도 개발이라고 한다_test first development라고도 함
개념
애자일*의 방법론 중 하나로 테스트 케이스를 먼저 작성하고 실제 코드를 개발하여 리펙토링*하는 절차를 따르는 방법이다.
기존 처럼 설계를 먼저 한 뒤 개발 , 테스트케이스를 작성하는 절차와 차이점이 있다.
테스트가 코드작성을 주도화 하는 개념
- 내/외부적으로 불확실성이 높은 경우 TDD를 진행하는 것이 좋음 (ex. 고객의 요구조건이 바뀔 가능성이 있는 프로젝트, 코드의 변화가 많을 수 있는 프로젝트, 유지보수의 주체가 개발자가 아닐 경우 등 )
- 메인 프로세스 : RED (테스트 실패), GREEN (테스트 성공), REFACTOR (리펙토링)
테스트 코드를 작성하는 도중에 발생하는 예외상황(버그, 수정사항)등은 테스트 케이스에 추가하고 설계를 개선한다. 이후 테스트가 통과한 코드만을 코드 개발 단계에서 실제 코드로 작성한다.
-> 이러한 과정이 반복되면서 자연스럽게 코드의 버그가 줄어들고, 소스코드는 간결해진다
- 효과 : 피드백과 협력을 동시에 증진시킴
TDD외에도 BDD*(behavior-Driven-Development : 행동 주도 개발), DDD*(Domain-Driven-Development : 도메인 주도 개발)의 방식도 있음
* 리팩토링( retactoring) : 결과의 변경없이 코드의 구조를 재조장 하는 것 _ 코드의 가독성을 높이고 이해, 수정하기 쉽게 만드는 과정
* 애자일 : 개발 방법론 중 하나로 소통을 통해 맞춤형으로 개발을 진행하는 방식 (추후에 디테일 한 부분 공부 후 포스팅 예정)
* BDD : TDD를 기반으로 파생된 방법, TDD와 비슷하지만 BDD가 더 요구사항에 집중해서 테스트를 개발하는 방식
* DDD : 순수히 모델과 로직에 집중하는 방법(일반적으로 많이 사용하지는 않음) 규칙이 동일하여 통일된 방식으로 할 수 있다는 것이 장점
TDD의 장점
- 객체 지향적인 코드 생산
모든 코드가 재사용 성 기반으로 작성되어야 하기 때문에 보다 기본적으로 객체지향적인 코드가 되는 것
- 재 설계 시간의 단축
미리 테스트 시나리오를 작성해봄으로써 코드 개발 전 기능을 구현하기 위한 예외 상황들을 미리 확인해보고 조사하게되는 효과 발생, 예외 코드를 작성하기 쉬워짐
- 디버깅 시간의 단축
기본적으로 TDD는 단위 테스트 기반의 테스트 코드를 작성하기 때문에 추후 문제가 발생했을 때 각각의 모듈 별(영역을 분할하여)로 테스트를 진행해보면 문제의 지점을 쉽게 찾아낼 수 있음
- 테스트 문서의 대체 가능
테스트 요소들이 사용자 관점으로 정의되고 진행되기 때문에 입력과 출력의 흐름이 명확해 지고 추후 구조의 변경 및 소스 수정 시 구조를 쉽게 파악하고 빠른 수정이 가능해짐. 또한 재사용 테스트로도 쉽게 가능해짐
- 추가 구현의 용이함(유지보수의 용이성)
자동화 된 유닛 테스팅을 전제하므로 테스트 기간을 획기적으로 단축 시킬 수 있다.
TDD의 단점
- 생산성 저하 (업무 효율성 저하? 일반적인 개발 방식에 비해 대략 10-30%의 시간이 증가함)
이론적으로는 좋은 것 같은데 하지 못하는 이유
- 개발시간이 증가하며 이미 해왔던 과정이 있어서 습관을 쉽게 바꾸기 쉽지 않음
전체적인 개발 시간을 줄이는 것보다 단기적인 성과에 집중해 있는 회사들이 많기 때문에
- 고정관념
너무 도구/규칙에 집착하지 말고 시작하자
본인이 어떻게 발전시키느냐가 애자일의 핵심이다
TDD를 잘하는 방법
적응적, 친화적으로 접근해야한다
참고
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Development_common_sense#tdd
http://clipsoft.co.kr/wp/blog/archives/6919
https://m.blog.naver.com/suresofttech/221569611618
'junior developer :) > CS(Computer Science)지식' 카테고리의 다른 글
API에 대하여(+ REST API, REST 성숙도 모델) (1) | 2022.10.06 |
---|---|
네트워크 기초 1. URL과 URI / IP / PORT / 도메인 / DNS_브라우저 작동원리(보이지 않는 곳) (0) | 2022.10.05 |
[CS] 자료구조란? (0) | 2022.07.30 |
[CS] 프레임워크와 라이브러리 개념과 차이점 (0) | 2022.07.28 |
[CS] 객체지향 vs 절차지향 (0) | 2022.07.21 |