1. PasswordLevelCheck

choizz156·2022년 8월 12일
0

TDD

목록 보기
1/6
post-thumbnail

테스트 주도 개발 예제

암호 레벨을 판독하는 프로그램을 만든다.
test 메서드 이름은 한글로 작성했다.(어차피 쓰고 버릴 것)
최대한 리팩토링을 하면서 수정을 해본다.
교재참고
그대로 따라하지 않고 내 방식대로 변형해서 코딩한다.

  • 조건
    - 길이가 12글자 이상.
    - 숫자 포함.
    - 대문자 포함.
  • 보안 수준
    - 3가지 조건 포함 : 강함
    - 2가지 조건 포함 : 보통
    - 1가지 조건만 포함 : 약함
    - 0가지 : 타당하지 않은 패스워드.

보안 수준 강함, 보통, 잘못된 값까지 작성

TestCode

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

public class PasswordLevelCheckTest {
    PasswordLevelCheck checker = new PasswordLevelCheck(); // 테스트 메서드 중복코드 리팩토링
    private void assertLevel(String pwd,PasswordLevel str //열거값 사용) { // 메서드를 만들어서 리팩토링
        PasswordLevel reuslt = checker.check(pwd);
        assertThat(str).isEqualTo(reuslt);
    }

    @Test
    @DisplayName("모든조건충족") //이 애노테이션을 써서 메서드를 설명할 수 있다.
    void MeetsAllConditions() {
        assertLevel("sdfeDEF1dfsdf",PasswordLevel.STRONG);
//        assertLevel("sdf",PasswordLevel.STRONG); NORMAL
//        assertLevel("sdfeDEFdfsdf",PasswordLevel.STRONG); NORMAL


    }


    @Test
    void 길이_12문자미만_제외_나머지_충족() {
        assertLevel("sfeDEF1f",PasswordLevel.NORMAL);
//        assertLevel("sdfeDEF1dfsdf",PasswordLevel.NORMAL); STRONG
    }
    @Test
    void 숫자제외_나머지_충족(){
        assertLevel("sdfeDEFdfsdf",PasswordLevel.NORMAL);
//        assertLevel("sdfeDEFdf2sdf",PasswordLevel.NORMAL); STRONG

    }
    @Test
    void null(){
        assertLevel(null,PasswordLevel.INVAILD);
    }

    @Test
    void 빈문자열() {
        assertLevel("",PasswordLevel.INVAILD);
    }

    @Test
    void 대문자제외_나머지_충족() {
        assertLevel("sdf32dgef324",PasswordLevel.NORMAL);
    }
}

Production Code

public class PasswordLevelCheck {
    public PasswordLevel check(String pwd) {
        if(pwd == null || pwd.isEmpty()) return PasswordLevel.INVAILD;
        if (pwd.length() < 12) return PasswordLevel.NORMAL;
        if(!isNumber(pwd)) return PasswordLevel.NORMAL;
        if(!isUpper(pwd)) return PasswordLevel.NORMAL;

        return PasswordLevel.STRONG;
    }
    private boolean isNumber(String pwd) { //리팩토링
        for(char num : pwd.toCharArray()) // 문자 배열로 만들기
            if(num>='0'&&num<='9') return true;

        return false;
    }

    private boolean isUpper(String pwd) {
        for(char up : pwd.toCharArray())
            if(Character.isUpperCase(up)) // 대문자인지 확인하는 방법
                return true;
        return false;
    }
}

public enum PasswordLevel { // 열거값을 사용한다.
    NORMAL, INVAILD, STRONG
}
profile
조금씩 성장하는 개발자...!

0개의 댓글