2023.01.03.TUE

ronglong·2023년 1월 3일
0

[Spring MVC] 테스팅

  1. 단위 테스트
  • 대부분 메서드 단위
  • 테스트 케이스 : 테스트 코드(테스트를 위한 입력 데이터+실행 조건+기대 결과)
  • F.I.R.S.T 원칙
    • Fast(빠르게)
    • Independent(각각의 테스트 케이스는 독립적)
    • Repeatable(반복 가능. 반복해도 같은 값)
    • Self-validating(셀프 검증이 되도록. 검증 결과 반환)
    • Timely(시기 적절하게. 기능 업그레이드와 동시에 테스트 케이스 업글)
  • BDD(Behavior Driven Development)
    • given : 입력 값(테스트 데이터), 전제 조건 등 준비.
    • when : 메서드 호출. expected, actual
    • then : 검증. assert. expected와 actual 비교
  • JUnit
    - Implementation >'org.springframework.boot:spring-boot-starter-test' 빌드.그레이들 파일에 스타터로 JUnit 포함되어 있음
    • @DisplayName("") : 테스트 이름
    • @Test
    • assertEquals(expected, actual); 등의 메서드 이용
    • assertNotNull(), assertThrows() 등
    • assertThrows() : 예상(기대)하는 예외가 발생하는지 검증
    • 테스트 케이스 실행 전, 전처리 : @BeforeEach(테스트 실행마다 전처리), @BeforeAll(한 번만 전처리)
    • 테스트 케이스 실행 후, 후처리 : @AfterEach, @AfterAll
    • Assumption : 가정. 특정 조건 설정에 유용.
    • assumeTrue() : 파라미터가 true면 아래 로직들을 실행
  1. JUnit을 사용한 단위 테스트 실습
  • 어찌저찌 풀었는데, 2번 문제 다른 사람들이 푼 거 보니까 나 진짜 너무 비효율적으로 풀었음..ㅋㅋㅋㅋ for밖에 모르는 나..⭐️
public class RandomPasswordGeneratorTest {
    @DisplayName("실습 3: 랜덤 패스워드 생성 테스트")
    @Test
    public void generateTest() {
        // given
        int numberOfUpperCaseLetters = 2;
        int numberOfLowerCaseLetters = 5;
        int numberOfNumeric = 2;
        int numberOfSpecialChars = 1;

        String password = RandomPasswordGenerator.generate(numberOfUpperCaseLetters,
                numberOfLowerCaseLetters, numberOfNumeric, numberOfSpecialChars);

        // when
        int expected = 10;
        int actual = password.length();

        // then
        assertEquals(expected, actual);
        assertEquals(numberOfUpperCaseLetters, getUpperNum(password));
        assertEquals(numberOfLowerCaseLetters, getLowerNum(password));
        assertEquals(numberOfNumeric, getNumNum(password));
        assertEquals(numberOfSpecialChars, getSpecialNum(password));
    }

    private int getUpperNum(String password){
        int count = 0;
        for(int i=0; i<password.length(); i++){
            if(password.charAt(i)>=65 && password.charAt(i)<=90) count++;
        }
        return count;
    }

    private int getLowerNum(String password){
        int count =0;
        for(int i=0; i<password.length(); i++){
            if(password.charAt(i)>=97 && password.charAt(i)<=122) count++;
        }
        return count;
    }

    private int getNumNum(String password){
        int count=0;
        for(int i=0; i<password.length(); i++){
            if(password.charAt(i)-'0'>=0 && password.charAt(i)-'0'<=9) count++;
        }
        return count;
    }

    private int getSpecialNum(String password){
        int count=0;
        for(int i=0; i<password.length(); i++){
            if(password.charAt(i)>=33 && password.charAt(i)<=47) count++;
        }
        return count;
    }
}
  1. Hamcrest를 사용한 Assertion
  • Hamcrest : JUnit 기반의 단위 테스트에서 사용 가능한 Assertion Framework
    -> 매쳐(Matcher)로 인한 가독성 향상
    -> 가독성 좋은 테스트 실패 메시지
  • 예시
    assertThat(actual, is(equalTo(expected)));
    assertThat(actual, is(notNullValue()));
  • 예외 확인은 JUnit의 assertThrows() 통해서 해당 예외의 클래스 확인 후 사용
  • 관련 자료
    https://www.crocus.co.kr/1658
  1. 기타 정리한 것

<느낀 점>
데일리 코딩이 너무 어려워서, 프로그래머스 쉬운 난이도의 문제부터 풀어보기로 했다.
당분간 쉬운 문제들을 풀며, 알고리즘에 자신감과 흥미를 가질 필요가 있다고 판단.
물론 나중에는 결국 어려운 문제들을 뚫어야겠지만.

오늘 단위 테스트는 '비교적' 쉬웠다. 지금까지는 JPA가 가장 어려웠던 것 같다.
하지만 개인 실습 코드 너무 비효율적으로 짜서 현타옴..ㅋㅋㅋ 부끄럽지만 일단 제출은 함.
JPA과제는 싹 밀고 새로 해봐야할 것 같다.

이제 JPA 유튜브 강의 듣고, 강의 듣다가 지겨우면 프로그래머스 문제도 몇 개 더 풀고 자야겠다.

0개의 댓글