[인프런 워밍업클럽 3기 백엔드 코드] 3주차 발자국
회고
성격상 한번에 두 개 하는 걸 힘들어 하는 스타일이라 이번주는 나름의 결단으로 테스트 강의 듣는데에 거의 올인했다. (월요일 오전에만 좀 코테 공부함) 내가 하는 공부인 코테 공부랑 워밍업 클럽 둘 중 하나가 시간을 적게 써도 충분히 되는 거였다면 둘 다 병행을 해도 감당할 수 있었겠지만 워밍업 클럽을 진행해보니 이거에도 시간을 많이 써야겠다는 판단을 하게 됐다.
그래서 맨 마지막 "테스트를 작성하는 마음가짐"이라는 마지막 강의를 제외하고서는 남은 모든 강의를 다 들었다.
아직 뭔가 프로젝트 하나 해보지 못한 나는 당연히 테스트 코드를 스스로 짜본적이 없었고, 그래서 이 강의를 듣고 싶었는데, 다 듣고 나니까 추후에 프로젝트를 진행할 때, 어떤 식으로 테스트코드를 짜고 테스트코드를 바탕으로 프로덕션 코드를 짜야 될지에 대해 감을 잡을 수 있었다.
다음주에는 복습하면서 이번주에 했던 11일차 미션했던 내용도 한번 배운 내용을 토대로 수정해봐야겠다.
미션 Day 11
https://github.com/myc0603/readable-code/tree/main/src/test/java/cleancode
저번 리팩토링 강의를 통해 작성했던 지뢰찾기 코드와 스터디카페 코드 중 하나를 선택해서 단위테스트를 작성하는 것이 미션이었다.
코드 자체가 스터디카페보다는 지뢰찾기도 좀 더 복잡했던 거 같아서 지뢰찾기를 선택해서 테스트 코드를 진행하였다.
작성했던 클래스들과 메서드들을 하나하나 보면서 테스트해볼 수 있는 코드가 뭐가 있을까 보면서 테스트 코드를 작성해보았다. 하다보니 이걸 어떻게 테스트 해야되지? 라는 의문도 생기고 이것도 테스트를 해야되나? 라는 의문도 생기는 등 여러 의문이 생겼는데 강의를 듣다 보니 미션을 하면서 생겼던 의문 중 해소되었다.
다음주에는 끝까지 들은 강의 내용을 바탕으로 테스트 코드를 다시 더 좋게 발전시켜볼 수 있을 거 같다.
강의 내용
Layer별 테스트
Persistence Layer:
거의 단위테스트 느낌 얘만 써서 테스트 하면 됨
Business Layer:
Persistence Layer랑 같이 묶어서 통합 테스트 진행
Presentation Layer:
Business Layer, Persistence Layer를 Mocking해서 테스트 진행,
그냥 http요청을 보냈을 때 ok 응답이 오는 지 정도 확인
productNumber, 재고 등등.. -> 동시성 이슈 고려
Transactional
Transaction "readOnly" - CQRS : command(CUD)와 query(Read)를 분리
서비스나 DB를 read용, write용 따로 만들 수 있음
JPA 사용시 객체를 캡쳐하는 등의 로직을 read만 할 때는 사용 안 할 수 있음
테스트에서 사용하게 되면 프로덕션 코드에서 Transactional을 잘 사용했는 지에 대한 테스트가 안 되니 이점 유의해서 사용
validation : 뭐에 대한 유효성 검증이냐에 따라 컨트롤러에서 검증할지 서비스에서 검증할지 등 고민해볼 필요가 있다.
Mocking
1. 가짜 객체를 만들어 사용 -> 필요한 경우 원하는 행위를 정해줄 수 있음 (Stubbing)
2. 원하는 메서드를 제외하고서는 진짜 객체처럼 행위를 원하면 Spy객체를 만들어 사용
3. Mocking을 어느 정도까지 할 지에 대해 고민해봐야 한다
하나의 테스트는 하나만 검증!
하지만 정말 하나에 테스트에서 딱 하나씩만 검증하다보면 테스트 별로 묶고 싶어지는 테스트가 생기기 마련
=> @ParameterizedTest, @DynamicTest 사용!!
완벽하게 제어하기
컨트롤하지 못하는 값 사용을 지양, 외부 시스템 Mocking
테스트 세팅 Test Fixture
각 테스트에서 세팅 vs @BeforeEach/@BeforeAll
세팅을 하기위한 세팅 같은 너무 기본적인 세팅이면 @BeforeEach/@BeforeAll, 웬만하면 각 테스트 코드에서 세팅
Test Fixture 클렌징
deleteAll() vs deleteAllInBatch()
테스트 환경 통합
서버 띄우는 횟수를 줄여 테스트 코드 돌리는데 드는 시간 단축
학습테스트
학습에 테스트 활용
Spring REST Docs
이거 진짜 유용해보이는데 제대로 복습하고 써봐야겠다
댓글을 작성해보세요.