[인프런 워밍업 클럽 스터디 2기 백엔드] 4주차 발자국

[인프런 워밍업 클럽 스터디 2기 백엔드] 4주차 발자국

개요

4주차 종료!

imagePractical Testing 실용적인 테스팅 가이드를 완강 했다!

인프런 워밍업 클럽 스터디 2기 백엔드 과정... 이것으로 끝!

감격스럽다.

4주차 공부한 내용

image권장 진도표에 맞게 진도를 나갔네?

 

배운 것들

1. Mockito

Mockito 라이브러리를 써봤지만, 사용할 때마다 찝찝한 느낌을 갖고 사용해왔다.

이번 주차에 강의를 학습하며 Mockito를 언제 쓰면 좋은지 @MockBean 과 @Mock 의 차이는 무엇인지를

제대로 알 수 있었다.

 

2. Classicist vs Mockist

우빈님은 Classicist 인데, 강의를 들어보니 나도 Classicist가 되었다.

정답이 있는 문제는 아니라 상황에 맞게 적절히 Mocking 할 땐 하고, 통합 테스트할 땐 하고 하면 될 듯 하다.

 

3. Test Fixture 가이드라인

다른 강의에서 Fixture를 하나의 클래스로 관리하라고 배웠었다.

그래서 그렇게 사용해왔는데, 문제는 원하는 필드를 지정해주고 싶을 때마다 Fixture를 생성하는 메서드가 증가하게 되고,

메서드가 증가하면 관리가 너무 어려워지곤 했다. 더군다나 큰 프로젝트 같은 경우 엔티티당 필드가 수 십개가 넘어가는 게 대부분 인데, 이걸 전부 하나의 클래스로 관리하는 건 별로 좋은 방법 같지는 않다.

 

강의를 통해서 Test Fixture를 어떻게 생성하는 지, 어떻게 생성 메서드를 관리하는 지 배울 수 있었다.

 

4. 테스트 환경 통합하기

테스트 환경을 통합해야 한다는 개념 자체를 몰랐다.

이런 게 가능할 거라 생각도 못했던 것 같다.

강의 들으면서 조금 충격을 받았다.

 

5. private 메서드를 테스트하고 싶은가? 그러면 책임 분리를 고민해봐라

이것도 충격!

private 메서드를 테스트하지 말라고 하시는 말씀에

"그렇구나, 테스트 안 해도 되네? 개꿀!" 이렇게 생각하며 설렁설렁 듣고 있었는데,

private 메서드를 새로운 객체에 public 메서드로 빼놓고 객체간 협력하게 하는 코드를 작성하시는 모습이 인상적이었다.

테스트 생각을 많이 하다 보면 자연스레 객체지향에 가까워질 수도 있음을 깨달았다.

 

6. 학습테스트

프로젝트에 쓰고 싶은 새로운 라이브러리를 테스트로 학습하는 건 정말 좋은 방법인 것 같다.

 

7. Spring REST docs

Swagger만 사용해봤는데 Spring REST docs는 들어는 봤지, 이번에 처음 사용해봤다.

설정하는 게 어렵긴 한데, 실무에서 많이 쓰인다고 하니 이번에 경험해볼 수 있어서 좋았다.

 

미션

이번 주차에는 Day 15. 미션, Day 18. 미션이 있었다.

 

Day 15. 미션 - Layered Test 작성법 자기만의 언어로 정리하기

배운 내용을 다시 한 번 정리하는 거라 어렵진 않았다.

https://zircon-neptune-a7d.notion.site/Day-15-Layered-test-124ba1f1340980ddb599f68747a2ddfe?pvs=4

 

Day 18. 미션

Day 18. 미션 - 1. @Mock, @MockBean, @Spy, @SpyBean, @InjectMocks의 차이 정리하기

image

역시 배운 내용을 다시 한 번 정리하는 거라 어렵진 않았다.

https://zircon-neptune-a7d.notion.site/Day-18-129ba1f134098015983ade0586420ed1?pvs=4

 

Day 18. 미션 - 2. 수도 코드로 작성된 테스트 3개의 코드를 재배치하기

제시된 수도 코드

@BeforeEach 
void setUp() {
    ❓
} 

@DisplayName("사용자가 댓글을 작성할 수 있다.")
@Test
void writeComment() {
    1-1. 사용자 생성에 필요한 내용 준비
    1-2. 사용자 생성
    1-3. 게시물 생성에 필요한 내용 준비
    1-4. 게시물 생성
    1-5. 댓글 생성에 필요한 내용 준비
    1-6. 댓글 생성

    // given
    ❓

    // when
    ❓

    // then
    검증
}

@DisplayName("사용자가 댓글을 수정할 수 있다.")
@Test
void updateComment() {
    2-1. 사용자 생성에 필요한 내용 준비
    2-2. 사용자 생성
    2-3. 게시물 생성에 필요한 내용 준비
    2-4. 게시물 생성
    2-5. 댓글 생성에 필요한 내용 준비
    2-6. 댓글 생성
    2-7. 댓글 수정

    // given
    ❓

    // when
    ❓

    // then
    검증
}

@DisplayName("자신이 작성한 댓글이 아니면 수정할 수 없다.")
@Test
void cannotUpdateCommentWhenUserIsNotWriter() {
    3-1. 사용자1 생성에 필요한 내용 준비
    3-2. 사용자1 생성
    3-3. 사용자2 생성에 필요한 내용 준비
    3-4. 사용자2 생성
    3-5. 사용자1의 게시물 생성에 필요한 내용 준비
    3-6. 사용자1의 게시물 생성
    3-7. 사용자1의 댓글 생성에 필요한 내용 준비
    3-8. 사용자1의 댓글 생성
    3-9. 사용자2가 사용자1의 댓글 수정 시도

    // given
    ❓

    // when
    ❓
    
    // then
    검증
    
}

제시된 수도 코드는 중복이 많아 보인다.

깔끔하게 정리해보는 미션이었다.

내가 재배치한 결과는 아래와 같다.

@BeforeEach 
void setUp() {
    1-1. 사용자 생성에 필요한 내용 준비
    1-2. 사용자 생성
    1-3. 게시물 생성에 필요한 내용 준비
    1-4. 게시물 생성
} 

@DisplayName("사용자가 댓글을 작성할 수 있다.")
@Test
void writeComment() {
    // given
    1-5. 댓글 생성에 필요한 내용 준비

    // when
    1-6. 댓글 생성

    // then
    검증
}

@DisplayName("사용자가 댓글을 수정할 수 있다.")
@Test
void updateComment() {
    // given
    2-5. 댓글 생성에 필요한 내용 준비
    2-6. 댓글 생성

    // when
    2-7. 댓글 수정

    // then
    검증
}

@DisplayName("자신이 작성한 댓글이 아니면 수정할 수 없다.")
@Test
void cannotUpdateCommentWhenUserIsNotWriter() {
		// given
    3-3. 사용자2 생성에 필요한 내용 준비
    3-4. 사용자2 생성
    3-7. 사용자1의 댓글 생성에 필요한 내용 준비
    3-8. 사용자1의 댓글 생성
    
    // when & then  --> 예외 발생
    3-9. 사용자2가 사용자1의 댓글 수정 시도
}

 

끝!

4주간 알차게 학습했다.

미션과 발자국, 두 개 강의 모두 100% 학습해서 뿌듯하다.

인프런 워밍업 클럽 스터디 GOOD!

 

 

댓글을 작성해보세요.

채널톡 아이콘