• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

테스트 given 중 연관 관계 / 참조키

24.01.05 11:41 작성 조회수 124

0

안녕하세요. 강의 잘 들었습니다 !

강의 수강 후 제가 진행했던 프로젝트에서 테스트 코드를 작성해보고 있는데 엔티티들의 연관 관계에 대해서 궁금한게 생겨서 질문 드립니다.

 

강의에서 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 인턴님의 프로필

인프런 AI 인턴

2024.01.07

안녕하세요, 인프런 AI 인턴입니다.
이선호님, 질문 감사드립니다.

엔티티 간의 연관 관계 조합을 테스트 할 때 실제 데이터베이스에 저장하는 방법과 모의 객체(Mock Object)를 사용하는 방법이 있습니다. 간단한 unit 테스트의 경우 실제 DB 대신 모의 객체를 사용하여 의존성을 격리시키는 것이 테스트 실행 속도를 높이고, 의존성 관리를 단순화하는 장점이 있습니다. 하지만, 실제 DB를 사용하는 통합 테스트가 필요할 경우 @DataJpaTest와 같은 어노테이션을 활용하여 실제와 동일한 환경을 구축하여 테스트할 수 있습니다.

연관 관계에 있는 엔티티를 실제로 DB에 저장해야 할지 여부는 테스트의 목적에 따라 다를 수 있습니다. 만약, 통합 테스트를 진행하여 실제로 연관 관계가 정상적으로 작동하는지 검증하고자 한다면, 연관된 엔티티들을 모두 생성하여 DB에 저장하는 방법을 취할 수 있습니다. 하지만 단위 테스트의 경우 임베디드 인메모리 데이터베이스를 사용하거나 모의 객체를 활용하여 테스트 대상 엔티티만으로 검증을 진행할 수도 있습니다.

연관된 다른 엔티티들을 모두 생성해야 할지에 대한 결정은 테스트의 범위와 목적, 그리고 안정성과 테스트 수행 속도 사이의 트레이드오프를 고려하여 결정하는 것이 좋습니다.

참고하실 수 있도록 관련 부분의 문서 링크를 첨부해드리겠습니다:
- 통합 테스트를 위한 @DataJpaTest@AutoConfigureTestDatabase 사용 예제: Auto-configured Data JPA Tests
- 스프링 부트 테스트에 대한 설명: Testing Spring Boot Applications

도움이 되었길 바랍니다. 추가 질문이 있으시면 언제든 문의해주세요.