Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Step3 - 테스트를 통한 코드 보호 #841

Open
wants to merge 12 commits into
base: jongminch0i
Choose a base branch
from

Conversation

JongMinCh0i
Copy link

리뷰 잘 부탁드립니다.

제 테스트 코드를 작성하다 보니 주문 테스트 코드에서 애를 먹었는데 방향성에 대해서 이렇게 검증하는 것이 맞을까요?

Q. Repository 계층까지 모킹하는 것이 맞는지, 실제 DB를 사용하는게 좋은지 궁금합니다.

제가 알기로는 @SpringBootTest 를 사용하면 값을 테스트 이후에 롤백해주는데 실제로 값이 입력되는 부분까지 확인하는 것이 테스트라는 개념에 더 부합하지 않나 싶은데 리뷰어님은 어떻게 생각하시나요?

Q. 여러 계층의 검증이 순차적으로 일어날 때, 테스트는 어떻게 구성하는 게 좋을까요? (orderLineItems -> menu -> table 순서) 와 같은 경우가 궁금합니다.

Q. OrderService와 같은 복잡한 비즈니스 로직을 테스트할 때 전략

Order, Menu, OrderTable 에서 각 케이스 마다 mock 객체와 stub 설정이 많이 필요한게 특히 어려웠습니다. 작성하다 보니 테스트 가독성과 데이터 설정의 중복 사이 에서도 고민이 됩니다.

@sah3122
Copy link

sah3122 commented Feb 6, 2025

Q. Repository 계층까지 모킹하는 것이 맞는지, 실제 DB를 사용하는게 좋은지 궁금합니다.
제가 알기로는 https://github.com/SpringBootTest 를 사용하면 값을 테스트 이후에 롤백해주는데 실제로 값이 입력되는 부분까지 확인하는 것이 테스트라는 개념에 더 부합하지 않나 싶은데 리뷰어님은 어떻게 생각하시나요?

단위 테스트를 작성하며 필요한 의존관계에 대해 모킹하는것은 자연스러운 과정이라고 생각합니다 😄
실제 DB를 사용해도 되지만, 테스트 코드를 작성함에 있어 통합 테스트와 단위 테스트는 분리되어야 하고, 의도가 다르다고 생각해요.
https://tecoble.techcourse.co.kr/post/2021-05-25-unit-test-vs-integration-test-vs-acceptance-test/

SpringBootTest 를 사용한다고 해서 자동으로 롤백을 해주는것이 아닌 @transactional 과 함께 사용하는 경우 롤백이 되는것으로 알고 있습니다 !
https://velog.io/@lundy/Spring-Boot-SpringBootTest-%ED%86%B5%ED%95%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%99%80-Transactional

@sah3122
Copy link

sah3122 commented Feb 6, 2025

Q. 여러 계층의 검증이 순차적으로 일어날 때, 테스트는 어떻게 구성하는 게 좋을까요? (orderLineItems -> menu -> table 순서) 와 같은 경우가 궁금합니다.

검증이 순차적으로 라는 의미가 모호한데, table 을 테스트 하기 위해 orderLineItems, menu 가 필요한 상황이라면 테스트를 하기 위한 setup 과정을 거쳐야 합니다 😄
만약 3가지 도메인이 하나의 행위에 영향을 끼친다면, 행위를 분리하는것도 고려해볼수 있을것 같아요 👍

@sah3122
Copy link

sah3122 commented Feb 6, 2025

Q. OrderService와 같은 복잡한 비즈니스 로직을 테스트할 때 전략
Order, Menu, OrderTable 에서 각 케이스 마다 mock 객체와 stub 설정이 많이 필요한게 특히 어려웠습니다. 작성하다 보니 테스트 가독성과 데이터 설정의 중복 사이 에서도 고민이 됩니다.

mock 객체가 많아짐에 따라 테스트 코드를 작성하는 비용이 높아지는것은 자연스러운 현상입니다.
이와 같은 비용을 줄이기 위해 TestFixture를 도입해보는것을 권장 드립니다.

stub 설정과 관련해서는 fake 객체를 작성해보는것도 좋을것 같아요 😄

Copy link

@sah3122 sah3122 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

테스트 코드 작성 잘해주셨습니다 👍
몇가지 코멘트를 남겨두었는데 확인 부탁드려요 😄

src/test/java/mission/step3/MenuGroupServiceTest.java Outdated Show resolved Hide resolved
src/test/java/mission/step3/MenuGroupServiceTest.java Outdated Show resolved Hide resolved
src/test/java/mission/step3/MenuGroupServiceTest.java Outdated Show resolved Hide resolved
src/test/java/mission/step3/MenuGroupServiceTest.java Outdated Show resolved Hide resolved
Copy link

@sah3122 sah3122 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

피드백 반영 잘해주셨습니다 👍
TestFixture를 전체적으로 반영해보는것에 대해 코멘트남겨두었는데 확인 부탁드려요 !

import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.verify;

public class MenuGroupTestFixture {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixture 를 MenuGroup 만이 아닌 다른 테스트 코드에서도 활용해보세요 😄
별도의 클래스 파일로 분리하면 다른 테스트 코드에서도 사용할수 있습니다.
#841 (comment) 에 남겨드린것 처럼 Fixture를 적극적으로 활용하여 테스트 코드 작성에 대한 리소스를 줄이수 있도록 경험해보세요 !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants