워밍업 클럽 3기 BE 클린코드&테스트 - 3주차 발자국
Day 12
섹션6. Spring & JPA 기반 테스트
Persistence Layer 테스트 (1)
Persistence Layer 테스트 (2)
DataJpaTest는 JPA 관련 빈들만 등록해주기 때문에 SpringBootTest보다 빠르다
@ActiveProfiles 어노테이션을 사용해 활성화 할 프로파일을 설정할 수 있다.
리스트를 검증할 때는 size를 먼저 검증하고
extracting + contains 조합을 많이 사용한다
extracting 내부에는 검증할 필드들을 넣어주면되고
contains는 다양한 api들이 있다.
여기서 사용한 containsExactlyInAnyOrder()는 순서 상관없이 인자로 들어온 튜플들이 정확히 존재하는지
extracting에 적은 필드의 순서대로 적어주면 된다.
Day 13
Business Layer 테스트 (1)
Persistence Layer는 비즈니스 가공 로직이 포함되어서는 안 된다.
Business Layer는 Persistence Layer와의 상호작용(Data를 읽고 쓰는 행위)을 통해 비즈니스 로직을 전개
Business Layer 테스트 (2)
SpringBootTest는 자동롤백이 안달려있고
DataJpaTest는 자동롤백이 달려있음
Day 14
Business Layer 테스트 (3)
Day 15
Presentation Layer 테스트 (1)
모킹: 가짜 객체로 대신하여 정상 동작할거야 라는 것을 가정하고
프레젠테이션 레이어
즉, 테스트하고자 하는 레이어에만 집중해서 테스트하겠다
readOnly = true : 읽기전용 트랜잭션CRD 작업이 동작 X / only Read
JPA : CUD 스냅샷 저장, 변경감지 등을 안해도 되기 때문에 성능 향상
CQRS - Command(CUD) / Query(R)
미션
Day 11
사용자의 입력값은 무조건 불신을 깔고 들어가야한다는 강사님의 말씀이 떠올랐다.
그래서 InputHandler를 테스트하고자 했다.
StudyCafeIOHandler를 테스트해야하나 고민했지만, 통합해주는 역할일뿐
입력에 대한 최종 책임은 InputHandler에 있다고 판단했다.
기존 InputHandler에는
private static final Scanner SCANNER = new Scanner(System.in);
로 스캐너가 생성되어있어서 테스트할 때 nextLine() 예외가 발생했다.
private final Scanner scanner;
public InputHandler(Scanner scanner) {
this.scanner = scanner;
}
사용자 입력같은 테스트하기 어려운 영역을 분리하자는 강사님의 말씀이 떠올라 외부에서 주입받도록
InputHandler를 변경해주었다.
또 해피 케이스말고 예외 케이스를 생각해 1~3 이외에 다른 입력시 들어왔을 때 예외가 잘 발생하는지 확인했다.
또 사물함을 사용할 수 있는 패스권인지 확인하는 메서드를 검증하기 위해
StudyCafePassType에 대한 테스트를 진행했다.
확실히 enum 타입으로 객체로 만드니 관련 로직을 위한 공간이 생겨 테스트가 용이하구나를 느꼈다.
그리고 가장 중요한 금액관련 테스트를 진행하고자했다.
금액 관련 테스트를 StudyCafePassOrder에서 전부 다 진행할까 했지만,
하나의 테스트는 하나의 책임만 가져야한다고 생각해서,
StudyCafeSeatPass, StudyCafeLockerPass에서 각각 진행했다.
테스트를 진행하면서 궁금한 점은
StudyCafeLockerPass lockerPass = StudyCafeLockerPass.of(StudyCafePassType.FIXED, 4, 10000);
처럼 of 메서드에서 csv 파일에 맞게 직접 입력해주는게 맞을지
아니면 LockerPassFileReader에서 객체를 찾아내서 테스트 하는게 맞을지 궁금하다.
그리고 DisplayName 짓는 것이 생각보다 되게 까다로웠다.
테스트는 쉽지않다.
하지만 올바르지 못한 테스트는 오히려 혼란을 일으킬뿐이라는 것은 알게되었다.
제대로 된 테스트를 작성하도록 노력하자.
모킹 테스트를 왜 해야는지는 아직 명확하게 와닿진 않는다.
알 때 까지 복습하자.
댓글을 작성해보세요.