테스트 코드 실습 (비밀번호 유효성 검증기)

Jiruen·2023년 5월 18일
0

FastCampus-Spring study

목록 보기
2/4
post-thumbnail

🔃 TDD circle of life

  1. Test fails
  2. Test passes
  3. Refactor

🔠용어 정의

  • main 디렉토리 ➞ 프로덕션 코드
  • test 디렉토리 ➞ 테스트 코드

🔧 실습 전 환경 설정

  • AssertJ dependency 추가
    • 테스트 코드 가독성을 높여주는 자바 라이브러리
    testImplementation 'org.assertj:assertj-core:3.23.1'
  • main과 test 디렉토리 구조를 맞춰주는 것이 좋으므로,
    test의 하위 디렉토리인 java에 'org.example' (main의 패키지명) 패키지 생성

💻 실습 코드

@DisplayName("")

  • 해당 테스트 코드의 의도를 표현하는 annotation
  • 예시)
@DisplayName("비밀번호 최소 8자 이상 12자 이하이면 예외가 발생하지 않는다.")
    @Test
    void validatorPasswordTest() {  ...  }

@ParameterizedTest


💻 더 낮은 결합도를 위한 테스트 코드 작성하기

🔧 환경 설정

  • passay 의존성 추가
    • 패스워드를 생성해주는 자바 라이브러리
      implementation 'org.passay:passay:1.6.1'

💻 코드 설명

  • RandomPasswordGenerator Class

    • 0부터 13자리의 패스워드를 랜덤하게 생성하는 class
  • User class

    • initPassword() : 패스워드 초기화
      public void initPassword() {
             RandomPasswordGenerator randomPasswordGenerator = new RandomPasswordGenerator();
             String randomPassword = randomPasswordGenerator.generatePassword();
             if (randomPassword.length() >= 8 & randomPassword.length() <= 12) {
                 this.password = randomPassword;
             }
         }
  • UserTest class

     @DisplayName("패스워드를 초기화한다.")
      @Test
      void passwordTest() {
          // given
          User user = new User();
    
          // when
          user.initPassword();
    
          // then
          assertThat(user.getPassword()).isNotNull();
      }

📌 테스트 케이스 실행 결과, 어떨 때는 성공이고, 어떨 때는 실패!

✖ WHY?

User class

RandomPasswordGenerator randomPasswordGenerator = new RandomPasswordGenerator();
  • 패스워드를 몇 글자로 생성할지 모르기 때문에 Test 코드 실행 시, 오류가 없거나 발생!

✔ HOW?

  1. interface 생성 (PasswordGeneratePolicy Interface)

    public interface PasswordGeneratePolicy {
      String generatePassword();
    }
  2. RandomPasswordGenerator가 PasswordGeneratePolicy를 구현

    public class RandomPasswordGenerator implements PasswordGeneratePolicy  {...}
  1. 컨트롤할 수 없었던 코드를 외부로부터 주입받기 생성

    • 컨트롤할 수 없었던 코드

      RandomPasswordGenerator randomPasswordGenerator = new RandomPasswordGenerator();
    • User Class

      public void initPassword(PasswordGeneratePolicy passwordGeneratePolicy ) {
            String randomPassword = passwordGeneratePolicy.generatePassword();
            ...}
    • 테스트 코드

      void passwordTest() {
            // given
            User user = new User();
      
            // when
            user.initPassword(new CorrectFixedPasswordGenerator());
      
            // then
            assertThat(user.getPassword()).isNotNull();
        }
        
      void passwordTest2() {
           // given
           User user = new User();
      
           // when
           user.initPassword(new WrongFixedPasswordGenerator());
      
           // then
           assertThat(user.getPassword()).isNull();
       }

📖 정리

  • 기존엔 내부에서 RandomPassword를 받아, RandomPasswordGenerator를 통해 패스워드 생성하고, 조건(8글자 이상 12글자 이하)에 맞춰 패스워드를 초기화
  • 하지만 테스트를 돌릴 때마다 실패, 성공 반복...!
  • 이를 컨트롤하기 위해서 PasswordGeneratePolicy 인터페이스 정의
  • PasswordGeneratePolicy를 구현한 CorrectFixedPasswordGenerator(8글자 이상 12글자 이하의 패스워드 생성 및 반환), WrongFixedPasswordGenerator(8글자 미만 12글자 초과의 패스워드 생성 및 반환)를 통해서 항상 통과 / 실패하는 테스트 생성!

user.initPassword(new CorrectFixedPasswordGenerator());
  • 항상 통과!
user.initPassword(new WrongFixedPasswordGenerator());
  • 항상 실패!

0개의 댓글