TDD1
0. Overview
테스트 코드를 작성 해본 경험은 있지만 실제 프로젝트에 적용한 적은 없었습니다. 늘 개발 일정은 운영 코드 위주로 산정했고 테스트 코드를 적용하기 위해 시도하는 시간을 들이지 못해서 이번에는 실제로 시간을 들여 도입하고 습관화 하는 걸 목표로 합니다.
우선 TDD 강의를 듣고 공부한 내용을 요약 하여 올립니다.
테스트 코드 작성기 Start !!
1. 코드 분해
코드 분해
큰 문제는 작게 분해하여 풀이 가능- 작게 분해된 코드는
재사용가능
코드 재사용
- 반복되는 문제의 풀이는 재사용 가능
- 소프트웨어 개발 비용 절감(엔지니어링)
- 문제에 대한 해법 나누기 : 모듈화 함
모듈화
분해
- 큰 시스템은 더 작은 하위 시스템으로 분해 가능
- 분해된 서브 시스템은 교체 가능
조립
- 작은 시스템은 조합해서 더 큰 상위 시스템으로 조립 가능
- 모듈 재사용
- 모듈 : 인터페이스 + 구현
-
- 인터페이스
- 모듈이 어느 기능을 제공하는 지? 그 기능을 제공 받기 위해서는 어떻게 모듈을 사용하는 지? 를 나타내는 설계
- 인터페이스
-
- 구현
- 실제로 그 기능이 어떻게 만들어지는 지
- 구현
-
- 모듈 : 인터페이스 + 구현
- 라이브러리
단위 테스트
모듈을 만든 후 자동으로 테스트하여 사용자에게 신뢰감을 주는 인터페이스를 제공
2. 테스트 기법
1. 수동 테스트
UI를 통해서기능 검증- 가장 온전한 코드 실행
인수 테스트가 속함-
다른 테스트에 비해
실행 비용이 높고 결과 변동이 큼- 실행 비용 : 테스트 케이스 작성, 실행 등에 대한 시간과 비용(인건비 등)
- 소프트웨어 회귀 발생
- 소프트웨어 회귀
-
새로운 기능이 추가 된 후, 기존 기능이 동작하지 않음
인수테스트
- 배치된 시스템을 대상으로 검증
- 전체 시스템 이상 여부 신뢰도가 높음
-
높은 비용- 작성 비용 / 관리 비용 / 실행 비용
-
피드백 품질이 낮음- 현상은 드러나지만 어느 부분이 원인인지 숨겨짐 -> 프로그래머가 찾아야함
2. 테스트 자동화
- 기능을 검증하는
코드 작성 - 테스트 코드 작성 비용이 소비 되지만,
실행 비용이 낮고 결과 신뢰도 높음 - 테스트 코드 작성과 관리가
프로그래머의 역량에 크게 영향받음 단위(Unit)테스트
단위(Unit) 테스트
- 시스템의
일부(하위 시스템)을 대상으로 검증 -
낮은 비용- 작성비용/ 관리 비용 / 실행 비용
-
높은 피드백 품질- 버그가 어디서 났는 지에 대한 내용을 피드백을 받을 수 있음.
- 전체 시스템 이상 여부 신뢰도가 낮음
3. 테스트 주도 개발
테스트 주도 개발 절차
- RED :
실패하는 테스트 추가
운영 코드 작성 전에 테스트 코드를 먼저 작성해서 테스트 실패를 확인 하는 단계
- GREEN :
테스트통과 /최소한의 코딩
운영 코드를 작성해서 새로운 테스트와 기존의 모든 작성된 테스트를 통과 하는 단계
- REFACTOR : 구현 설계
개선/ 테스트통과유지
테스트 결과가 유지 되는 걸 확인하면서 코드 구조 등 변경
테스트 실패
-
구체적인 하나의 요구사항을 검증하는 하나의 테스트를 추가
-
추가된 테스트가 실패하는 지 확인
- 실패하는 것을 확인해야 테스트가 동작 함을 확인함
- 실패 이유가 운영 코드 때문인지 확인해야함(테스트 코드를 잘못짜서 실패하는 경우가 있기 때문에..)
테스트 성공
- 추가된 테스트 + 기존 테스트 코드가 성공하도록 운영 코드 변경
- 테스트 성공 = 요구사항 만족 (
코딩의 가장 중요한 임무) - 테스트 성공을 위한 최소한의 변경만 함
리팩터링
- 코드 베이스 정리
- 구현 설계 개선 (!= 인터페이스를 변경하는 게 리팩터링 아님)
- 가독성
- 적응성
- 성능
- 모든 테스트 성공을 전제
켄드 벡의 설계 규칙
Passes the tests : 테스트 통과
Reveals intention : 의도 노출 (= 가독성 높힘)
No duplication : 중복 제거
Fewest elements : 가장 적은 요소 (=테스트에 포함 되지 않는 코드는 모두 제거함)
4. 마치며
현재 패스트캠퍼스의 The RED : 이규원의 현실 세상의 TDD : 안정감을 주는 코드 작성 방법를 50% 정도 수강했습니다. 수강 내용들을 정리하고 실제로 프로젝트에 도입한 내용들을 기록하겠습니다 :)
ref : https://fastcampus.co.kr/courses/203146/clips/