작성
·
530
1
안녕하세요 강사님~!! 항상 감사한 마음으로 수업 잘 듣고 있습니다 ㅎㅎ
테스트 픽스쳐 관련해서 궁금한 점이 있어 질문 드립니다. 엔티티에 fixture 함수를 정의하게 되면 테스트에 필요한 내용이 실제 운영 코드로 전파되거나, 반대로 (운영 코드인) 엔티티의 정적함수가 테스트 환경에만 종속되는 문제가 있을 것 같은데 어떻게 생각하시는지 궁금합니다!!
답변 2
3
2022. 09. 30. 10:20
안녕하세요 돌아온무리뉴님~!!! 크으~~~~ 정말정말 좋은 질문이십니다 ㅎㅎㅎㅎ
말씀해주신 것처럼 fixture 함수가 엔티티에 있게 되면 (정확히는 엔티티에 있는 것과 무관하게 프로덕션 코드에 있는 경우도 마찬가지입니다!) 테스트에 필요한 내용이 프로덕션 단에 전파되고, 특히 Entity가 들어가는 core 모듈은 보통 대부분의 다른 모듈이 가지고 있다보니 전파 범위가 넓죠 😢
정적 팩토리 함수가 테스트 환경에만 종속되는 것에 대해서 저는 약간 다른 관점입니다! 정적 팩토리 함수는 여러개를 추가할 수 있고, 테스트에서 쓰이는 fixture
함수를 일반적인 정적 팩토리 메소드의 of
나 from
이 아니라 fixture
이라 이름 지은 것도 테스트에만 쓰이는 것을 표현해보기 위함이었어요!!! 만약, 프로덕션 환경에서 정적 팩토리 메소드가 필요하다면 convention에 조금 더 부합하는 네이밍을 사용함으로써 '프로덕션용 정적 팩토리 함수'를 만들 수 있을 것입니다!!
그렇지만, 여전히 운영 환경에 테스트용 코드가 전파되는 단점이 있는 것은 사실입니다!
사실 이런 선택을 하게된 사연이 있는데요!! 멀티 모듈 환경에서 모듈 간의 의존성을 설정해주시면 기본적으로 프로덕션 코드 간의 의존성만 설정되고, 테스트 코드 간에는 의존성 설정이 이루어지지 않습니다. 물론 테스트 코드 간의 의존성 설정을 할 수 있긴한데 무척 번거로웠어요!!! (또 최신 gradle에서는 업데이트 되었을 수도 있습니다!)
예시를 들어보겠습니다!
A 모듈
프로덕션 코드
테스트 코드
B 모듈
프로덕션 코드
테스트 코드
가 있다고 해볼게요!
A 모듈은 B 모듈의 코드를 사용할 수 있도록 설정해주면, B 모듈의 프로덕션 코드에 있는 클래스는 A 모듈의 프로덕션 코드에서 접근 가능한 반면, B 모듈의 테스트 코드에 있는 클래스는 A 모듈의 테스트 코드에서 접근 불가능합니다!!!
그래서 테스트 코드에 fixture를 놓게 되면 1) fixture가 모든 모듈의 테스트 코드에 중복으로 들어가거나 2) 번거로운 테스트 코드간의 의존성 설정을 해주어야 했습니다!
또한, 아직 매력적인 Java (or Kotlin) Faker 라이브러리를 찾지 못해 수동으로 객체를 생성해주어야 했고요..!! (JS 진영의 예시로는 fakerjs가 있습니다! https://fakerjs.dev/)
그래서 선택을 한거에요!! 마치 setter를 열어두되 쓰지 말자고 한 것처럼 fixture를 프로덕션에 두되, 테스트에서만 쓰기로요!! 물론 저도 아쉬운 부분입니다 ㅎㅎㅎㅎ 🥲
혹시 더 좋은 방법이 있다면 편하게 말씀해주세요!! 감사합니다~!! 😊
1
2022. 09. 30. 11:41
친절한 설명 감사드립니다 강사님!!
사실 저는 강의를 들으며 강사님께서 fixture 함수를 정적함수로 빼서 테스트용 객체를 생성하시는 걸 보고 좋다고 생각해서 적용해봤는데, 질문드린 것과 같은 리뷰를 받아서 고민이 있었거든요..!! 답변을 보고 각 방식에 대한 장단점에 대해 더욱 명확하게 이해할 수 있었습니다.
그리고 멀티 모듈 환경에 대해서는 생각을 못했었는데, 앞으로는 설계나 코딩을 할 때 멀티 모듈 환경도 고려하면서 해야겠다는 생각을 했습니다. 관련해서 잠깐 찾아보니 테스트 픽스쳐를 java-test-fixtures라는 라이브러리가 있긴 하지만, 사용을 위해선 이것저것 설정이 필요한 것 같더라구요 ㅎㅎ
결국 고민해서 내린 결론은 "팀과 환경에 따른다"일 것 같습니다. ㅎㅎ 두 방식 다 각각의 트레이드 오프가 있는 것 같아서 제가 소속된 팀과 임하는 프로젝트에 따라 적절하게 선택하려고 합니다. 친절하고 자세한 설명 다시 한 번 감사드립니다 :)
2022. 09. 30. 11:45
크으~~~ 맞습니다 ㅎㅎㅎㅎ 저 역시 이 방법이 최고에요~ 이 방법 무조건 쓰세요~ 는 절대 아니고 인력 상황과 팀, 프로젝트에 따라 적절한 선택의 영역 (Trade-Off 영역)이라고 생각합니다!
좋은 질문 남겨주셔서 감사드립니다~!!! 🙏