2jigoo / BookStudy-StartTdd

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

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

Closed Jonghai closed 1 year ago

Jonghai commented 1 year ago

<TDD 이전의 개발>

  1. 만들 기능에 대해 고민한다. 어떤 클래스와 인터페이스를 도출할지 고민하고 각 타입에 어떤 메서드를 넣을지 시간을 들여 생각한다.
  2. 과정 1을 수행하면서 구현에 대해서도 고민한다. 대략 어떻게 구현하면 될지 머릿속에 그려지면 코드를 쓰기 시작한다.
  3. 기능에 대한 구현을 완료한 것 같으면 기능을 테스트 한다. 이 과정에서 원하는 대로 동작하지 않거나 문제가 발생하면 과정2에서 작성한 코드를 디버깅하면서 원인을 찾는다.

TDD 이전의 개발에서는 결국 디버깅하면서 원인을 찾는 시간에 길어져 개발시간보다 버그를 찾는 시간이 더 길어질 수 있다.

<TDD란?>

TDD는 테스트부터 시작하는 개발방법론.

덧셈 기능에 대한 예

plus() 메서드 기능을 작성하기 전에 Test부터 만들기 다음과 같은 조건들을 생각하며 Test를 작성한다.

https://github.com/2jigoo/BookStudy-StartTdd/blob/70a2e6e14b26263a037b8a08609dfc177fc4110e/src/test/java/chap02/CalculatorTest.java#L9-L14

assertEquals()를 사용하여 실행결과가 올바른지 검증.

당연히 plus()를 아직 작성 안했으니 오류가 날 것. plus() retrun값을 0으로 주고 기대값을 3으로 설정했을때 테스트를 돌려보면 기대값과 다르기 때문에 오류가 날 것.

이러한 과정을 반복하면서 plus()는 테스트를 통과 시키기 위해 점진적으로 기능을 완성시켜나간다.

Jonghai commented 1 year ago

<TDD 예: 암호 검사기>

문자열을 검사해서 규칙을 준수하는지에 따라 암호를 '약함', '보통', '강함'으로 구분한다.

검사할 조건 세가지 1 . 길이가 8글자 이상

  1. 0부터 9사이의 숫자를 포함
  2. 대문자 포함

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

암호 검사 기능에서 가장 쉽거나 가장 예외적인 상황.

https://github.com/2jigoo/BookStudy-StartTdd/blob/70a2e6e14b26263a037b8a08609dfc177fc4110e/src/test/java/chap02/PasswordStrengthMeterTest.java#L13-L17

암호의 강도는 int 타입으로 약하면 0 보통이면 1 강하면 2 라고 할 수 있지만. 열거타입을 사용하여 암호강도를 더 잘 표현함. https://github.com/2jigoo/BookStudy-StartTdd/blob/70a2e6e14b26263a037b8a08609dfc177fc4110e/src/main/java/chap02/PasswordStrength.java#L1-L5

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

https://github.com/2jigoo/BookStudy-StartTdd/blob/70a2e6e14b26263a037b8a08609dfc177fc4110e/src/test/java/chap02/PasswordStrengthMeterTest.java#L18-L22

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

https://github.com/2jigoo/BookStudy-StartTdd/blob/70a2e6e14b26263a037b8a08609dfc177fc4110e/src/test/java/chap02/PasswordStrengthMeterTest.java#L23-L26

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

테스트 코드도 유지보수 대상이다. 즉 테스트 메서드에서 발생하는 중복을 알맞게 제거하거나 의미가 잘 드러나게 코드를 수정할 필요가 있다.

https://github.com/2jigoo/BookStudy-StartTdd/blob/70a2e6e14b26263a037b8a08609dfc177fc4110e/src/test/java/chap02/PasswordStrengthMeterTest.java#L8-L12

매 테스트 코드마다 PasswordStrengthMeter 객체를 생성하는 코드는

PasswordStrengthMeter passwordStrengthMeter = new PasswordStrengthMeter();

=>

다음과 같이 private 전역변수로 두어 중복을 제거.

private PasswordStrengthMeter passwordStrengthMeter = new PasswordStrengthMeter();

암호 강도 측정 기능을 실행하고 이를 확인하는 코드 중복 제거.

PasswordStrength result = passwordStrengthMeter .meter(암호);
assertEquals(기댓값, result);

=>

assertStrength 메서드를 사용하도록 바꿀 수 있다.

private void assertStrength(String password, PasswordStrength expStr){
        PasswordStrength result = passwordStrengthMeter.meter(password);
        assertEquals(expStr,result);
    }