[Practical Testing: 실용적인 테스트 가이드] 회고 3주차

출처 : Practical Testing: 실용적인 테스트 가이드

 

학습 내용 요약

  • lombok 주의사항

    • @Data,

      @Setter,

      @AllArgsConstructor 지양

    • 양방향 연관관계 시 @ToString 순환 참조 문제

섹션3 단위 테스트

테스트케이스 세분화

  • 경계값 테스트

  • 예외 테스트 

 

테스트 어려운 영역 분리하기

  • 관측할 때마다 다른 값에 의존

    • 현재 시간

    • 랜덤값

    • 전역 변수/함수

    • 사용자 입력

  • 외부 세계에 영향을 주는 코드

    • 표준 출력

    • 메시지 발송

    • 데이터베이스 기록 등

테스트 하기 좋은 코드

  • 순수함수

    • 같은 입력에는 항상 같은 결과

    • 외부와 단절

       

 

섹션4 TDD

  • RGB

    • RED : 실패하는 테스트 작성

    • GREEN : 테스트만 통과하는 최소한의 코드

    • Blue : 코드 개선 및 테스트 통과 유지

 

  • 선 기능 구현 후 테스트 작성

    • 테스트 누락 가능성

    • 특정 케이스(해피 케이스)만 검증할 가능성

    • 잘못된 구현을 늦게 발견할 가능성

       

     

  • 선 테스트 후 기능 구현

    • 복잡도가 낮은(유연, 유지보수 쉬운) 테스트 가능한 코드로 구현하게 된다

    • 쉽게 발견하기 어려운 엣지 케이스를 놓치지 않게 해준다

    • 구현에 따른 빠른 피드백(테스트 결과 확인)

    • 과감한 리팩토링 가능

섹션5 테스트는 []다

DisplayName을 섬세하게

  • 명사 나열보다는 문장으로

    • [X] 음료 1개 추가 테스트 (~테스트 지양)

    • [O] 음료 1개를 추가할 수 있다

    • [OO] 음료 1개를 추가하면 주문 목록에 담긴다 (테스트 행위 결과까지 기술)

  • 도메인 용어 사용

    • [X] 특정 시간 이전에 주문을 생성하면 실패한다

    • [O] 영업 시작 시간 이전에는 주문을 생성할 수 없다. (도메인 용어 사용하여 추상화된 내용 담기)

  • 테스트 현상 중점으로 기술 X

BDD 스타일로 작성하기 

  • TDD에서 파생된 개발 방법

  • 함수 단위 테스트 보다는 시나리오에 기반한 테스트케이스(TC) 자체에 집중하여 테스트

  • 개발자가 아닌 사람이 봐도 이해할 수 있을 정도의 추상화 수준(레벨) 권장

     

     

  • Given / When / Then

    • Given

      • 시나리오 진행에 필요한 모든 준비(데이터 생성)

    • When

      • 시나리오 행동 진행

    • Then

      • 시나리오 진행에 대한 결과 명시, 검증

 

섹션6 Spring & JPA 기반 테스트

  • 엔티티 생성 테스느는 id NotNull 체크

assertThat(orderResponse.getId()).isNotNull();
  • 목록 조회 테스트는 개수, 데이터 값 일치 확인

assertThat(products).hasSize(2)
        .extracting("productNumber", "name", "sellingStatus")
        .containsExactlyInAnyOrder(
                tuple("001", "아메리카노", SELLING),
                tuple("002", "카페라떼", HOLD)
        );
  • @SpringBootTest vs @DataJpaTest

    • @Transactional 유무 차이

    • @Transactional이 없는 class 테스트에 @Transactional을 사용하는 경우 테스트 신뢰성이 깨질 수 있음

 

댓글을 작성해보세요.

채널톡 아이콘