인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

도토리님의 프로필 이미지

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

Persistence Layer 테스트 (2)

테스트 코드에서 data.sql 사용 없이 Product를 직접 생성한 이유

작성

·

49

·

수정됨

0

테스트 코드 작성 시에 data.sql을 활용하지 않으신 이유가 궁금합니다. @Test 메서드 내에서 Product를 생성하는 것보다 이미 작성된 data.sql을 활용하는 것이 더 편해보이는데 Product 인스턴스를 직접 생성하신 이유가 무엇인가요?

혹시 테스트마다 필요로 하는 데이터가 다르기 때문인 것일까요?

답변 2

0

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, 도토리 님!

뒤쪽 섹션8 강의 중에도 이야기하는 내용인데요.
연습 프로젝트의 경우 크기가 작고 다루기 편한 형태라 초반에는 data.sql을 사용하는 것이 편해 보일 수 있겠습니다만, 실무에서 다루는 거대한 프로젝트 안에서 모든 test fixture 를 data.sql로 관리하려면 이 또한 커다란 관리 포인트가 됩니다. 유지보수가 필요한 또 다른 지점이 생기는 것이죠.

또한 여러 사람이 작업하는 상황에서, 각자의 테스트 케이스에 맞게 data.sql 을 지속적으로 업데이트하고 관리하기란 꽤 어려운 일일 거예요.
예를 들어 Product의 필드가 수십 개인데, 각 테스트마다 사용하고자 하는 필드가 달라서 그에 맞게 모든 데이터를 하나의 data.sql에서 생성하려면.. 정말 복잡하겠죠.

그래서 각 테스트 케이스에 맞게, 테스트 클래스 내에서 가독성 있게 fixture 생성 로직을 관리할 수 있는 방향으로 소개드렸습니다.

도움이 되셨기를 바랍니다.
감사합니다. 🙂

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.
도토리님, 질문 주셔서 감사합니다.

테스트 코드 작성 시 특정 엔티티, 예를 들어 Product를 직접 생성하는 이유는 여러 가지가 있을 수 있습니다.

  1. 테스트의 독립성: 각 테스트가 서로 독립적으로 실행되어야 합니다. data.sql을 사용하면 모든 테스트가 같은 초기 데이터에 의존할 수 있으며, 어떤 테스트가 데이터를 변경하면 다른 테스트에 영향을 미칠 수 있습니다. 따라서 테스트 코드 내에서 직접 Product를 생성하면 이러한 문제를 방지할 수 있습니다.

  2. 테스트별 요구사항 차이: 해당 테스트마다 필요한 데이터가 다를 수 있습니다. 예를 들어, 조건을 다양하게 테스트하기 위해 여러 다양한 상태의 Product 객체가 필요할 수 있습니다. 직접 객체를 생성하면 이러한 요구를 유연하게 처리할 수 있습니다.

  3. 구체적인 테스트 시나리오 구현: 특정 시나리오를 검증하기 위해 Product를 특정 방식으로 구성해야 할 수도 있습니다. 직접 인스턴스를 생성함으로써 필요한 속성을 설정하고 필요한 대로 시나리오를 맞출 수 있습니다.

  4. 테스트 속도와 유지보수: 직접 객체를 생성하는 방식은 데이터를 파일에서 로딩하는 방식보다 더 빠를 수 있으며, 변경이 필요할 때 여러 파일을 수정할 필요 없이 코드만 수정하면 되어 유지보수가 용이합니다.

이러한 이유로 data.sql을 사용하지 않고 Product를 직접 생성하는 방법을 선택할 수 있습니다. 각 테스트의 목적과 필요에 따라서 가장 적절한 방법을 선택하는 것이 중요합니다.

Spring Boot에서의 테스트 관련 추가 정보는 아래에서 확인할 수 있습니다:
- Spring Boot Reference Documentation - Testing
- Testing Spring Applications

궁금하신 점이 더 있으시면 언제든지 문의 주세요!