[워밍업 클럽 2기 - Clean Code & Test Code] 4주차 발자국
워밍업 클럽 2기: Clean Code & Test Code의 4주차 발자국 작성입니다.
📝 학습 내용
Presentation Layer 테스트 작성
Mock
더 나은 테스트를 작성하기 위한 여러 팁
REST Docs
✍ 학습 내용 복습
Q. Presentation Layer의 특징은?
클라이언트로 부터 입력을 받아서 비즈니스 계층으로 해당 요청을 보내는 계층
요청을 제일 먼저 받는 계층
입력 데이터에 대한 기본적인 검증을 수행한다
Presentation 계층에서의 검증과 Business 계층에서의 검증을 분리해서 생각해야 한다
Presentation 계층에서는 보통 형식적인 검증을 한다
예시: 필수 입력 값 검사, 데이터 타입 검사, null 검사, 빈 문자열 검사
Business 계층에서는 비즈니스 로직에 따른 도메인 유효성 검사가 이루어진다
Business 계층으로 부터 결과를 받아서 클라이언트로 반환한다
컨트롤러에서 사용하는 요청 DTO가 서비스 계층으로 침투하지 못하도록 컨트롤러 계층에서 서비스 전용 DTO로 변환하는 것을 권장한다(상황에 따라 다를 수 있을것 같다. 만약 받는 포맷이 변할 가능성이 거의 없다면, 그냥 컨트롤러의 DTO를 쭉 사용해도 괜찮지 않을까 생각이 된다.)
Q. Presentation Layer의 테스트 방법은?
Business, Persistence 계층을 모킹해서 테스트한다
MockMvc
같은 도구를 사용해서 HTTP요청과 응답을 시뮬레이션 한다모킹을 위해서
Mockito
같은 프레임워크를 사용할 수 있다
Q. Test Double의 종류를 정리해보자면?
Dummy: 아루런 동작도 하지 않는 객체. 잘 사용되진 않지만, 보통 파라미터 전달용으로 사용된다.
Fake: 실체 객체와 동일한 기능은 수행하지만, 프로덕션 용도로 사용하기에는 적합하지 않은 객체.
예시: 인메모리로 맵을 사용해서 가짜 레포지토리를 구현하는 경우
Stubs: 테스트에서의 요청에 대해 미리 준비된 결과를 제공하는 객체. 미리 반환할 데이터가 정의되어 있고, 호출하는 경우 해당 데이터를 반환한다. 미리 정의되어 있지 않은 것들은 응답하지 않는다.
Spies: Stub이지만 정복 기록도 함께하는 객체. 호출 여부, 호출 횟수 등의 정보를 기록할 수 있다. 일부는 실제 객체 처럼 동작하고, 일부는 Stubbing할 수 있다.
Mocks: 행위에 대한 기대를 명세하고, 그 명세에 따라 동작되도록 설계 된 객체. 그러니깐 개발자가 직접 그 객체의 행동을 관리하는 객체이다.
Q. Stub과 Mock을 구분하는 기준은?
Stub : 상태 검증(State Verification)
Mock : 행동 검증(Behavior Verification)
TIP. 테스트 작성을 위한 여러 팁을 정리해보면
Mockito 프레임워크를 한번 래핑하는 BDD Mockito 프레임워크를 사용해서 조금 더 자연스러운 API 네이밍으로 프레임워크를 사용할 수 있다
테스트 간의 독립성을 보장하자
테스트에서 전역 변수를 정의해서 사용하는 것은 권장하지 않는다
@BeforeEach
또는@AfterEach
메서드를 사용한 레포지토리 클렌징@Transactional
사용
Test Fixture용 클래스를 따로 분리해서 사용하는 것은 권장하지 않는다
Test Fixture를
@BeforeEach
를 사용한 셋업 메서드에서 사용하는 경우, 중복 제거보다 해당 테스트에 해당 내용을 알아야하는지 고려해보고 적용하자테스트 내용은 동일한데 입력값만 변경해보면서 테스트 해보고 싶으면
@ParameterizedTest
사용private
메서드에 대한 테스트가 필요하다면 해당 메서드의 책임을 분리할지 고민해본다단순히 테스트하기 위해서
public
으로 열어두는 것은 권장하지 않는다
Q. REST Docs vs Swagger의 차이는?
REST Docs
테스트를 통과해야 문서가 만들어지기 때문에 신뢰도가 높다
프로덕션 코드에 비침투적이다
코드의 양이 많고 설정이 상대적으로 어렵다
Swagger
적용이 쉽다
문서에서 바로 API 호출이 가능하다
애노테이션을 달아줘야 하기 때문에 프로덕션 코드에 침투적이다
🤔 회고
워밍업 클럽의 마지막 주차가 되었다. 강의 양이 많아도 내가 정말 필요한 내용을 담아서 만들어져있어서, 시간 가는 줄 모르고 시청했다.
강의와 미션을 따라가면서 학습에 많은 도움을 받았다. 만약 워밍업 클럽 3기가 있다면 다시 참가할 예정이다.
지금까지 학습 내용을 다시 복습해보고 더 나아가서 프로젝트에 적용하는 것이 목표이다.
🔍 참고
댓글을 작성해보세요.