[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을 사용하는 경우 테스트 신뢰성이 깨질 수 있음
댓글을 작성해보세요.