
인프런 워밍업 클럽 스터디 3기 - 백엔드 코드 4주차 발자국
강의 수강
섹션7. Mock
프로젝트할 때, 다른 팀원이 mock을 이용해 테스트코드 짠것을 보고 살짝 느낌만? 이해해서 테스트를 작성한 경험이 있다. 이번 강의를 수강하면서, stubbing을 한다라는 개념을 이해하고 내가 작성했던 코드를 더 잘 이해할 수 있게 되었다.
Mock vs Stub
Mock은 Stub이 아니다.
Mock : 행위에 대한 기대를 명세하고 그에 따라 동작
Stub : 테스트에서 요청한 것에 대해 미리 준비한 결과를 제공. 그 외에는 응답하지 X
둘의 차이는
Stub의 목적은 상태 검증
Mock의 목적은 행위 검증
Mock vs Spy
Spy란? 객체에서 일부는 Stubbing 하고 싶고, 일부는 실제 객체 동작처럼 하고 싶을때는 Spy를 사용한다.
참고
디비는 트랜잭션이 끝날때까지 커넥션을 가지고 있는데 메일전송같은 네트워크를 타거나 긴 작업의 경우에는 트랜잭션을 걸지 않는 것이 좋다.
섹션8. 더 나은 테스트
테스트 간 공유하는 변수같은 공유자원은 쓰지 말자.
각 테스트에서 given 데이터가 겹치는 경우가 많다.
중복 제거하려고 beforeach나 beforeall에서 공유 변수들을 생성하려고 하는 경우가 있는데, 이거는 지양하자.
이유
-> 테스트 간 결합도를 높인다.
-> 각 테스트를 이해할 때 자꾸 스크롤하면서 봐야됨.
그럼 beforeeach는 언제?
각 테스트 입장에서 봤을 때, 아예 몰라도 테스트 내용을 이해하는 데에 문제가 없는가?
수정해도 모든 테스트에 영향을 주지 않는가?
이 두 조건을 만족하면 beforeach에 있어도 됨.
TextFixtur 클렌징
deleteAll()
order만 지워도 orderProduct까지 같이 지워진다.
-> 성능 이슈가 있을 수 있다.
엔티티 삭제 순서 고려 해야함.
테스트도 비용이기 때문에, deleteAll()은 훨씬 비용이 크다. 그래서 강사님은 deleteAllInBatch() 선호함.
이외 유용한 테스트 방법
@Parameterized
값이나 환경을 바꿔가면서 테스트를 확장하고 싶을 때 사용
@DaynimicTest
하나의 환경을 설정하고, 사용자 시나리오를 테스트하고 싶을 때.
환경에 변화를 주면서 중간 중간 검증을 하고 싶을 떼 사용
테스트 비용
같은 스프링부트테스트여도, profile 차이나 환경이 조금만 달라져도 다시 스프링부트가 실행된다. -> 실행 속도 느려짐.
테스트 환경 통합하자.
private 메소드는 테스트할 필요 X
테스트 해야될 거 같으면 객체 분리 필요한지 생각해보고, 분리해서 테스트 수행
섹션9. Spring REST Docs
스웨거만 사용해봤었는데, 나중에 REST Docs도 프로젝트에 적용해봐야겠다.
REST Docs
장점 :
테스트를 통과해야 문서가 만들어진다.
프로덕션 코드를 건드리지 않고 문서 작성 가능
단점:
코드 양이 많다.
설정이 어렵다.
Swagger
장점 :
적용이 쉽다.
문서에서 바로 API 호출을 수행해볼 수 있다.
단점 :
프로덕션 코드를 수정해야 한다.
테스트와 무관해서 신뢰도가 떨어진다.
미션
Day16
강의를 수강하면서 짬뽕처럼 뒤섞여 있던 각 레이어별 테스트가 과제를 통해 내용을 적어보면서 머리에서 비교적 정리가 된 것 같다. 그리고 통합테스트, 단위테스트, mock 테스트에 대해 정리해보면서 각 테스트에 대한 개념과 차이에 대해 이해할 수 있었다. 나중에 공부한 내용을 까먹더라도, 테스트할 때 어떤 테스트를 수행할지 찾아보고 적합한 테스트를 골라서 테스트코드를 작성할 수 있을 것이다.
Day18
강의를 들으면서는 mock과 spy 차이에 대해서만 인지했다. 과제 수행을 위해 인터넷을 뒤져가며 공부를 한 끝에 @Mock, @MockBean, @Spy, @SpyBean, @InjectMocks 의 차이에 대해 알 수 있었다. 이제 필요한 때에 적절한 mock이나 spy, injectmocks를 사용할 수 있게 되었다. 그리고 given, when, then에 맞추어 테스트 명령어를 정리하는 실습을 통해 시나리오에 맞추어 테스트를 수행한다라는 개념을 이해하게 된 것 같다.
댓글을 작성해보세요.