SEB_BE 55일차 - 테스팅2

subimm_·2022년 11월 9일
0

코드스테이츠

목록 보기
55/83

💡 오늘의 학습목표

  • Hamcrest
  • 슬라이스 테스트

📔 Hamcrest

  • Junit 기반의 단위 테스트에서 사용할 수 있는 Assertion Framework이다.
  • Assertion을 위한 매쳐(Matcher)가 자연스러운 문장으로 이어지므로 가독성 향상
  • 테스트 실패 메시지를 이해하기 쉬움
  • 다양한 Matcher를 제공함.

📖 JUnit Assertion을 사용한 단위 테스트에 HamcrestAssertion 적용해보기

  • JUnit -> Hamcrest1
  • JUnit Assertion 기능 이용
    • assertEquals(expected, actual);
      • 파라미터로 입력된 값의 변수 이름을 통해 대략 어떤 검증인지 알 수 있으나, 구체적인 의미는 유추가 필요함.
  • Hamcrest의 매쳐 이용
    • assertThat(actual, is(equalTo(expected)));
      하나의 영어 문장으로 자연스럽게 읽혀짐. 결과값이 기대값과 같다는 것을 검증한다.
      assertThat() 메서드의 파라미터
      첫번째 파라미터는 테스트 대상의 실제 결과 값.
      두번째 파라미터는 기대하는 값. 예상 값.

  • 테스트 실패 시


  • JUnit -> Hamcrest2
  • currencyName is not Null Value 성공

  • JUnit -> Hamcrest3
  • 발생한 예외가 null인지 여부 체크
  • (1) 과 같이 JUnit의 assertThrows() 메서드를 이용하여 리턴값으로 받은 Exception 내부의 정보를 가져와서 추가로 검증
  • Hamcrest만으로 예외를 테스트하기 위해서는 Custom Matcher를 직접 구현해서 사용

📙 슬라이스 테스트 (Slice Test)

  • 각 계층에 구현해 놓은 기능들이 잘 동작하는지 특정 계층만 잘라서 테스트 하는 것.
    • 스모크 테스트
      QA부서에서 본격적으로 전체 기능 테스트를 진행하기 전, 애플리케이션의 특정 수정 사항으로 인해 영향을 받을 수 있는 범위에 한해서 제한된 테스트를 진행

📖 API 계층 테스트

  • 대부분 클라이언트의 요청을 받아들이는 핸들러인 Controller 가 대상
  • Controller 테스트를 위한 테스트 클래스 구조
  • (1) Application Context 생성 (애플리케이션에 필요한 Bean객체들이 등록되어 있음)
  • (2) Controller 테스트를 위한 애플리케이션의 자동 구성 작업을 해줌
  • (3) DI로 주입 받은 MockMvc는 Tomcat 같은 서버를 실행하지 않고 컨트롤러를 테스트 할 수 있는 환경을 지원해주는 일종의 Spring MVC 테스트 프레임워크
  • (4) 테스트하고자 하는 Controller 핸들러 메서드의 테스트 케이스 작성
  • MemberController 테스트
  1. Given
    a. (1) 포스트맨 사용 시 request body에 포함시키는 요청 데이터와 동일한 역할
    b. (2)에서 Gson이라는 JSON변환 라이브러리를 이용해서 (1)에서 생성한 MemberDto.Post 객체를 JSON 포맷으로 변환해준다.

    Gson 라이브러리 사용 :
    build.gradle의 dependencies에 implementation 'com.google.code.gson:gson' 추가

  2. When
    a. MockMvc로 테스트 대상 Controller의 핸들러 메서드에 요청을 전송하기 위해서는 (3)과 같이 perform() 메서드를 호출해야함. (세부 정보 포함)
    b. MockMvcRequestBuilders 클래스를 이용해서 빌더 패턴을 통해 request정보를 채워넣기 가능

    • (4)에서 post()메서드를 통해 HTTP POST METHOD와 request URL 설정
    • (5)에서 accept() 메서드를 통해 클라이언트 쪽에서 리턴 받을 응답 데이터 타입으로 JSON 타입으로 설정
    • (6)에서 contentType()메서드를 통해 서버 쪽에서 처리 가능한 Content Type으로 JSON 타입 설정
    • (7)에서 content() 메서드를 통해 request bosy 데이터 설정
      ((2)에서 Gson 라이브러리를 이용해 변환된 JSON 문자열)
  3. Then
    a. MockMvc의 perform() 메서드는 ResultActions 타입의 객체를 리턴하는데, 이 객체를 이용해서 우리가 전송한 request에 대한 검증을 수행할 수 있다.
    b. (8)에서 andExpect() 메서드를 통해 파라미터로 입력한 매쳐로 예상되는 기대 결과 검증 가능
    (8)에서 status().iscreated()를 통해 response status가 201(Created)이 맞는지 검증
    c. (9)에서 andReturn()을 통해서 response 데이터 확인 , 디버깅 용도로 response로 전달되는 응답 데이터를 출력할때 사용됨.

    • 한글 깨질 시 yml 파일에 추가
  • response body의 각 프로퍼티의 값 검증 기능 추가
  • (1) jsonPath() 메서드를 통해 response body(JSON형식) 의 각 프로퍼티 중에서 응답으로 전달 받는 email 값이 request body로 전송한 email과 일치하는지 검증
  • (2), (3) 도 마찬가지
    • jsonPath()를 사용하면 JSON형식의 개별 프로퍼티에 쉽게 접근 가능

📖 데이터 액세스 계층 테스트

  • 데이터 액세스 계층을 테스트 하기 위한 규칙
    • DB의 상태를 테스트 케이스 실행 이전으로 되돌려서 깨끗하게 만든다.
  • MemberRepository 테스트
  • (1) @DataJpaTest 애너테이션을 테스트 클래스에 추가함으로써, MemberRepository의 기능을 정상적으로 사용하기 위한 Configuration을 Spring이 자동으로 해준다.
    • Transactional 애너테이션을 포함하고 있어서 하나의 테스트 케이스 실행이 종료되면 저장된 데이터가 롤백됨.
  • (2) 테스트 대상인 MemberRepository를 DI 받는다.
  • (3) 테스트 할 회원 정보 데이터 준비
  • (4) 회원 정보 저장
  • (5) 회원정보가 잘 저장되었는지 검증
    • (5-1)과 같이 정상 저장 뒤에 리턴값으로 반환된 Member객체가 null이 아닌지 검증
    • 나머지는 리턴값으로 반환된 객체의 필드들이 테스트 데이터와 일치하는지 검증

✔ 회원 정보 조회 테스트
중복된 이메일 주소가 있는지를 조회하는 기능의findByEmail((String email)) 메서드 테스트

  • (1) 에서 테스트 할 회원 정보 데이터를 준비
  • (2)에서 회원 정보 저장
  • (2)에서 저장한 회원 정보 중에서 이메일에 해당되는 회원 정보를 잘 조회하는지 테스트하기위해 (3)과 같이 findByEmail() 로 회원정보를 조회
  • (4)에서 회원정보의 조회가 정상적으로 이루어지는지 검증
    • null이 아닌지 검증
    • (4-2)에서 조회한 회원의 이메일 주소와 테스트 데이터의 이메일과 일치하는지 검증
  • @SpringBootTest
    • 통합 테스트에 적합
  • @WebMvcTest
    • 웹 계층 전용 슬라이스 테스트에 적합
  • @DataJpaTest
    • 데이터 계층
profile
코린이의 공부 일지

0개의 댓글