2jigoo / BookStudy-StartTdd

'테스트 주도 개발 시작하기' 스터디
2 stars 0 forks source link

[1주차-1] TDD 시작 (1/2) - 2jigoo #2

Closed 2jigoo closed 1 year ago

2jigoo commented 1 year ago

1

Chapter 2. TDD 시작 (1/2)

목표

TDD가 무엇인지 경험해보며, 스터디 방향 잡아나가기


학습내용 정리

2jigoo commented 1 year ago

TDD 도입 전의 개발

TDD

테스트부터 시작하기 기능의 동작을 검증하는 테스트 코드를 먼저 작성 테스트를 통과시키기 위해 개발 진행

  1. 기능을 검증하는 테스트 코드 작성
    • 메서드 이름, 파라미터, 반환값, 정적/인스턴스 메서드, 클래스 이름 등을 고민 후 작성
    • 아직 클래스를 생성하지 않았기에 컴파일 에러
  2. 테스트 대상인 클래스 생성 및 메서드 생성
    • 단순히 생성만 했기에 아직 실패하는 테스트
  3. 테스트를 통과시키는 코드 작성
    • 구현은 고려하지 않고, 일단 테스트를 통과하도록 임의로 return
  4. 다른 테스트를 추가 → 실패
  5. 테스트를 통과하도록 구현을 수정하기
  6. 이 과정을 반복하며 점진적으로 구현해나가기
  7. 구현이 완료된 후, 실제 빌드 대상 모듈로 이동
2jigoo commented 1 year ago

예제: 암호 검사기

2jigoo commented 1 year ago

첫 번째 테스트: 모든 규칙을 충족하는 경우

  1. 모든 조건을 충족하는 테스트

    PasswordStrength result = meter.meter("ab12!@AB");
    assertEquals(PasswordStrength.STRONG, result);
  2. 구현 없이 메소드를 생성 → 테스트 실패

  3. 테스트를 통과하도록 코드를 수정

    // PasswordStrengthMeter#meter
    return PasswordStrength.STRONG
  4. 테스트 통과

  5. 같은 조건을 만족하는 테스트 추가


두 번쨰 테스트: 길이만 8글자 미만이고 나머지 조건은 충족하는 경우

→ PasswordStrength.NORMAL

  1. 테스트 추가
    PasswordStrength result = meter.meter("ab12!@A");
    assertEquals(PasswordStrength.NORMAL, result);
  2. 기존 테스트와 해당 테스트를 통과할만큼만 구현
    // PasswordStrengthMeter#meter
    if (s.length() < 8) {
    return PasswordStrength.NORMAL;
    }
    return PasswordStrength.STRONG;
  3. 테스트 통과
  4. 같은 조건을 만족하는 테스트 추가


세 번째 테스트: 숫자를 포함하지 않고 나머지 조건은 충족하는 경우

→ PasswordStrength.NORMAL

  1. 테스트 추가
    PasswordStrength result = meter.meter("ab!@ABqwer");
    assertEquals(PasswordStrength.NORMAL, result);
  2. 기존 테스트와 해당 테스트를 통과할만큼만 구현
  3. 테스트 통과
  4. 리팩토링이 필요하면 리팩토링
    // PasswordStrengthMeter#meter
    if (s.length() < 8) {
    return PasswordStrength.NORMAL;
    }
    boolean containsNumber = isContainingNumber(s); // 구현
    if (!containsNumber) {
    return PasswordStrength.NORMAL;
    }
    return PasswordStrength.STRONG;

코드 정리: 테스트 코드 정리

테스트 코드도 유지보수 대상 중복을 알맞게 제거하거나 의미가 잘 드러나게 수정해야 한다. 오히려 테스트 코드 관리가 어려우지게 된다면 변경을 되돌린다.