[Computer Science] TDD(Test Driven Development)

in·2023년 10월 2일
0

Computer Science

목록 보기
3/6

📌 TDD(Test Driven Development)

테스트 주도 개발

✔️ 기존 방법

✔️ TDD

➡️ 반복적인 테스트와 수정을 통해 고품질의 소프트웨어를 탄생시킬 수 있음

 

Red 단계에서는 실패하는 테스트 코드 먼저 작성
Green 단계에서는 테스트 코드를 성공시키기 위한 실제 코드 작성
Blue 단계에서는 중복 코드 제거, 일반화 등의 리팩토링 수행

장점

  • 작업과 동시에 테스트를 진행하면서 실시간 오류 파악 가능(시스템 결함 방지)
  • 짧은 개발 주기를 통해 고객의 요구사항 빠르게 수용 가능, 피드백이 가능하고 진행 사항 파악이 쉬움
  • 자동화 도구를 이용한 TDD 테스트 케이스를 단위 테스트로 사용 가능
    (Java는 JUnit, C/C++은 CppUnit)
  • 개발자가 기대하는 앱의 동작에 관한 문서를 테스트가 제공

➕ JUnit
가장 널리 사용되는 Java 단위 테스트 프레임워크
JUnit을 시작으로 CUnit, CPPUnit, PyUnit 등 xUnit 프레임워크 탄생

단점

  • 기존 개발 프로세스에 테스트 케이스 설계가 추가되므로 생산 비용 증가
  • 테스트의 방향성, 프로젝트 성격에 따른 테스트 프레임워크 선택 등 추가로 고려할 부분의 증가

예제

중간고사, 기말고사, 과제 점수를 통한 성적을 내는 간단한 프로그램
➡️ 점수 총합 90점 이상은 A, 80점 이상은 B, 70점 이상은 C, 60점 이상은 D, 나머지는 F

✔️ 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); // 확인
   }
   
}

현재는 Score 클래스와 computeGrade() 메소드가 구현되지 않은 상태(테스트 코드로만 존재)

✔️ 점수를 저장할 Score 클래스를 생성

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;
    }
    
}

✔️ 점수 계산을 통해 성적을 뿌려줄 computeGrade() 메소드를 가진 클래스 생성


// 인터페이스 구현
public interface ScoreStrategy {
    
    public String computeGrade(Score score);
    
}
// 인터페이스 오버라이딩 한 클래스 구현
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;
    }
    
}

➡️ 통과 가능한 정보를 넣고 실행하면 제대로 실행

  • TDD를 활용하면 처음 시작하는 단계에서 테스트케이스를 설계하기 위한 초기 비용이 더 들지만 유지보수 비용이 더 클 수 있음
  • 안전성이 필요한 소프트웨어 프로젝트에서는 개발 초기 단계부터 확실하게 다져놓는 것이 중요
  • 유지보수 비용이 더 크거나 비행기, 기차에 필요한 소프트웨어 등 안전성이 중요한 프로젝트의 경우 현재 실무에서 TDD를 활용한 개발 진행 중

[참고 자료]

🔗링크
🔗링크

0개의 댓글