테스트 given 중 연관 관계 / 참조키
287
작성한 질문수 2
안녕하세요. 강의 잘 들었습니다 !
강의 수강 후 제가 진행했던 프로젝트에서 테스트 코드를 작성해보고 있는데 엔티티들의 연관 관계에 대해서 궁금한게 생겨서 질문 드립니다.
강의에서 Order의 create를 테스트하기 위해 Product를 먼저 생성 후 DB에 저장하는 것과 비슷하게,
커뮤니티의 게시글이라면,
게시글(Board)과 작성자(User)는 엔티티에서 연관 관계가 설정되어 있고 Board 테이블에는 User의 PK가 참조키로 설정해야할 때, given에서 User 엔티티도 DB에 save 후 저장된 User를 Board가 참조하도록 테스트 코드를 작성하는게 맞을까요 ?
제가 궁금한 것은, 실제 서비스라면 엔티티들은 수많은 연관 관계가 있을텐데
한 엔티티의 비즈니스 로직 등을 테스트하기 위해, 그 엔티티와 연관 관계에 있는 다른 엔티티들을 모두 given 절에서 생성하고 DB에 저장해야 하는지 궁금합니다.
감사합니다 !
답변 2
0
안녕하세요, 이선호 님!
일단 2가지 포인트로 말씀드릴 수 있을 것 같아요.
1. 테스트 수행을 위한 최소한의 정보(필수값) 위주로 엔티티 생성
Board에 대한 테스트 케이스(이하 TC)라면, 해당 케이스 내에서 User에 대한 정보는 아예 필요가 없거나 극히 일부만 필요할 것 같아요. 물론 TC에 따라 다르겠지만요.
이런 경우 User 생성 시 builder에 정말 필요한 값만 넣고, 나머지는 생략하거나 의미 없는 값으로 채운 뒤 저장하면 좋을 것 같습니다.
2. given절에는 TC에 직접적인 관계가 있는 데이터만 드러내기
강의 중에도 언급한 내용인데요. ㅎㅎ
만약 TC에 정말 Board만 필요한 경우라면, 단순히 Board를 만들기 위한 User 등의 부가 정보는 setUp(@BeforeEach) 절로 분리하는 것이 좋습니다.
// BoardIntegrationTest
User user;
@BeforeEach
void setUp() {
user = createUser(...); // 최소한의 필수값 정보만 가지고 생성
}
@DisplayName("게시글이 when하면 then해야 한다.")
@Test
void boardTest() {
// given
Board board = createBoard(..., user.getId());
// ...
}given절에는 TC에 해당하는 내용만 직접적으로 나오도록 하여 문서로서의 기능을 드러내는 것이 중요하기 때문이죠.
도움이 되셨기를 바랍니다.
감사합니다. 🙂
0
안녕하세요, 인프런 AI 인턴입니다.
이선호님, 질문 감사드립니다.
엔티티 간의 연관 관계 조합을 테스트 할 때 실제 데이터베이스에 저장하는 방법과 모의 객체(Mock Object)를 사용하는 방법이 있습니다. 간단한 unit 테스트의 경우 실제 DB 대신 모의 객체를 사용하여 의존성을 격리시키는 것이 테스트 실행 속도를 높이고, 의존성 관리를 단순화하는 장점이 있습니다. 하지만, 실제 DB를 사용하는 통합 테스트가 필요할 경우 @DataJpaTest와 같은 어노테이션을 활용하여 실제와 동일한 환경을 구축하여 테스트할 수 있습니다.
연관 관계에 있는 엔티티를 실제로 DB에 저장해야 할지 여부는 테스트의 목적에 따라 다를 수 있습니다. 만약, 통합 테스트를 진행하여 실제로 연관 관계가 정상적으로 작동하는지 검증하고자 한다면, 연관된 엔티티들을 모두 생성하여 DB에 저장하는 방법을 취할 수 있습니다. 하지만 단위 테스트의 경우 임베디드 인메모리 데이터베이스를 사용하거나 모의 객체를 활용하여 테스트 대상 엔티티만으로 검증을 진행할 수도 있습니다.
연관된 다른 엔티티들을 모두 생성해야 할지에 대한 결정은 테스트의 범위와 목적, 그리고 안정성과 테스트 수행 속도 사이의 트레이드오프를 고려하여 결정하는 것이 좋습니다.
참고하실 수 있도록 관련 부분의 문서 링크를 첨부해드리겠습니다:
- 통합 테스트를 위한 @DataJpaTest 및 @AutoConfigureTestDatabase 사용 예제: Auto-configured Data JPA Tests
- 스프링 부트 테스트에 대한 설명: Testing Spring Boot Applications
도움이 되었길 바랍니다. 추가 질문이 있으시면 언제든 문의해주세요.
private 상수 테스트 관련 질문
0
83
1
void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??
0
126
2
커버리지는 어떻게 활용하시는지 궁금합니다.
0
161
2
테스트 문서화 질문입니다
0
105
2
단위테스트 질문이 있습니다
0
96
2
컨트롤러는 모킹을 한 이유가 궁금합니다.
0
103
2
ERD 가장자리에 있는 도메인 테스트 질문
0
89
2
DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?
0
135
2
OrderCreateRequest DTO에 대해서 궁금한점
0
102
2
고전파의 테스트 대역 사용 대상, 공유 의존성
0
156
2
계층 관련 질문이 있습니다.
0
139
3
'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다
1
124
2
혹시 update 로직은 어떻게 테스트하나요? (@Setter?)
0
135
2
단위테스트와 통합테스트의 경계가 궁금합니다.
0
228
2
Service+Repository 통합테스트 관련 질문입니다.
0
150
2
OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요
0
185
2
test 용 .yml
0
90
2
throws Exception
0
80
2
카페키오스크 클래스 문의 ,,
0
89
2
Rest docs 문서용 테스트코드를 따로 작성해야 되나요?
0
174
2
테스트 코드에서 필요한 생성자
0
138
1
tearDown 순서
0
116
2
@Builder 생성자 private
0
136
2
@DisplayName gradle / intellJ
0
93
2





