-
(3) 테스트 주도 개발(TDD)CS 지식/▷ Software Engineering 2021. 8. 15. 12:14
1. TDD란?
1-1) 정의
테스트 주도 개발, 테스트가 개발을 이끌어 나가는 것
1-2) 기존 방식과의 대비
(a) 기존
보통 설계(디자인)을 한 이후, 코드 개발과 테스트 과정을 거치게 됨
(b) TDD
설계(디자인)을 한 이후, 테스트 과정을 먼저 작성한 이후 코드를 개발하고 다시 디자인을 수정하는 리팩토링 과정을 수행하며 개발을 하는 것
(c) 디자인
위에서 언급된 디자인은 여러 예시가 있지만 DDD(Design Driven Desgin/Developent) 등이 있음
추가 참조 : https://ppiyo5.tistory.com/21
도메인 주도 설계(Domain Driven Development) 이해
* 도메인 주도 설계(Domain Driven Development) 도입 배경 Before 기존의 개발 - 데이터에 종속적인 애플리케이션 - 모델링과 개발과의 불일치 발생 After 도메인 주도 설계 - 이런 불일치를 해소하기 위한
ppiyo5.tistory.com
1-3) 도입 이유
- 글쓰기와 같이 검토/고쳐쓰기를 통해 좋은 글이 완성되는 것 처럼 마찬가지로 소프트웨어에 적용한 것
- 초기 TDD 작성비용이 높지만, 소프트웨어가 복잡해져갈 수록, 유지보수 비용이 절감되는 효과를 가져갈 수 있는 방법
1-4) 장단점
(a) 장점
- 작업과 동시에 테스트를 진행하면서 실시간으로 오류 파악이 가능함 ( 시스템 결함 방지 )
- 짧은 개발 주기를 통해 고객의 요구사항 빠르게 수용 가능.
- 피드백이 가능하고 진행 상황 파악이 쉬움
- 자동화 도구를 이용한 TDD 테스트케이스를 "단위 테스트"로 사용이 가능함 (자바는 JUnit, C와 C++은 CppUnit 등)
(b) 단점
- 기존 개발 프로세스에 테스트케이스 설계가 추가되므로 생산 비용 증가
- 테스트의 방향성, 프로젝트 성격에 따른 테스트 프레임워크 선택 등 추가로 고려할 부분의 증가
2. TDD 예제
1) Design
중간고사, 기말고사, 과제 점수를 통한 성적을 내는 간단한 프로그램을 구현
디자인 요구사항 : 점수 총합 90점 이상은 A, 80점 이상은 B, 70점 이상은 C, 60점 이상은 D, 나머지는 F
2) TDD 테스트
TDD 테스트케이스를 먼저 작성
35 + 25 + 25 = 85점이므로 등급이 B가 나와야 한다.
따라서 assertEquals의 인자값을 "B"로 주고, 테스트 결과가 일치하는지 확인하는 코드 구현
public class GradeTest { @Test public void scoreResult() { Score score = new Score(35, 25, 25); // Score 클래스 생성 SimpleScoreStrategy scores = new SimpleScoreStrategy(); String resultGrade = scores.computeGrade(score); // 점수 계산 assertEquals("B", resultGrade); // 확인 } }
3) 구현체 / 인터페이스 작성
(a) 구현체
public class Score { private int middleScore = 0; private int finalScore = 0; private int homeworkScore = 0; public Score(int middleScore, int finalScore, int homeworkScore) { this.middleScore = middleScore; this.finalScore = finalScore; this.homeworkScore = homeworkScore; } public int getMiddleScore(){ return middleScore; } public int getFinalScore(){ return finalScore; } public int getHomeworkScore(){ return homeworkScore; } }
(b-1) 인터페이스 - 역할
public interface ScoreStrategy { public String computeGrade(Score score); }
(b-2) 구현체 클래스 작성
public class SimpleScoreStrategy implements ScoreStrategy { public String computeGrade(Score score) { int totalScore = score.getMiddleScore() + score.getFinalScore() + score.getHomeworkScore(); // 점수 총합 String gradeResult = null; // 학점 저장할 String 변수 if(totalScore >= 90) { gradeResult = "A"; } else if(totalScore >= 80) { gradeResult = "B"; } else if(totalScore >= 70) { gradeResult = "C"; } else if(totalScore >= 60) { gradeResult = "D"; } else { gradeResult = "F"; } return gradeResult; } }
(c) 테스트 주도 개발 장점
- 차후 복잡도가 올라가면 유지 보수가 쉬워짐
- 실무 프로젝트 단위에서는 다양한 출력 결과물이 필요하고, 원하는 결과가 나오는지 테스트를 통한 검증이 필요함
- 리팩터링, feature 추가 등의 코드 변경 이후에 안정성을 매번 검증할 수 있음
참조
https://gyoogle.dev/blog/computer-science/software-engineering/TDD.html
TDD(Test Driven Development) | 👨🏻💻 Tech Interview
TDD(Test Driven Development) TDD : 테스트 주도 개발 우리는 보통 개발할 때, 설계(디자인)를 한 이후 코드 개발과 테스트 과정을 거치게 된다. 하지만 TDD는 기존 방법과는 다르게, 테스트케이스를 먼저
gyoogle.dev
반응형'CS 지식 > ▷ Software Engineering' 카테고리의 다른 글
(4) MVC 패턴 (0) 2021.10.05 (2) 시큐어 코딩 (0) 2021.08.08 (1) 클린코드와 리팩토링 (0) 2021.08.04