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

강동훈님의 프로필 이미지
강동훈

작성한 질문수

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

테스트 수행도 비용이다. 환경 통합하기

테스트 환경 통합 질문

작성

·

518

0

안녕하세요. 테스트 환경 통합 강의를 보다가 궁금한 사항이 있어서 질문드립니다. 강의 내용처럼 통합 테스트를 수행할 때 여러번 Spring 서버를 띄우는 것을 효과적으로 개선하기 위해 TestSupport 추상클래스를 상속받아 Repository/Service 계층 테스트시에 통합된 환경을 구축하는게 더 좋은 것은 이해했는데요.

Controller 테스트의 경우, 강의 내용처럼 따로 스프링을 띄우지 않고 @WebMvcTest로만 테스트코드를 작성하는 경우라면 공통 추상 클래스를 구현하는게 비효율적일수도 있을 것 같아서 궁금증이 생겼습니다.

@WebMvcTest(Controllers="Controller.class") 형식으로 컨트롤러 클래스들을 명시해 줘야 하는데, 클래스가 수십개로 많아질수록 매번 추가해야 하고, Controllers에 많은 클래스를 넣어야 하고(패키지 단위로 지정한다든가 등의 방식은 없는것 같더라구요), 각 클래스에서 사용하는 MockBean이 많아질수록 필드가 많아져서 본문이 길어 보기 힘들수도 있을 것 같아서요.

@SpringBootTest처럼 서버를 띄우는 비용이 발생하지 않으므로, 각각의 컨트롤러 테스트마다 명시적으로 @WebMvcTest를 사용하고, 해당 클래스에서 사용할 Mockbean 또한 명시적으로 지정하는 방식도 괜찮을까요?

실무적인 관점으로 볼 때, 제 생각대로 Controller 클래스의 테스트는 통합하지 않고 각각 구현하는 건 어떨지 궁금합니다.

답변 2

1

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

안녕하세요, 강동훈님! :)

좋은 질문이네요. ㅎㅎ 답변 드리겠습니다.

@WebMvcTest가 @SpringBootTest처럼 서버를 띄우는 비용이 발생하지 않는다, 라고 말씀주셨는데요.
일리가 있는 말씀이지만, 그렇다고 @WebMvcTest를 구성하는 데에 비용이 전혀 들지 않는 것은 아닙니다.
해당 어노테이션에 대해 이미 잘 아시겠지만, @WebMvcTest는 웹 계층 테스트를 위한 Bean만 찾아서 컨텍스트를 구성합니다.

즉, 소개드린 것처럼 통합된 환경이 아니라면 Controller마다 컨텍스트를 새로 구성하는 시간이 소요되어 전체 테스트의 시간은 훨씬 늘어나게 됩니다.

단, 이는 일종의 Trade-off인데요.
제안주신 방법은 단위 테스트의 속도가 빠르고, 통합 테스트의 속도가 느린 방법이고요, 제가 말씀드린 방법은 단위 테스트의 속도가 느리고, 통합 테스트의 속도가 빠른 방법입니다.
제가 해당 방법을 선택한 이유는, 일반적으로 Controller의 경우 단위 테스트의 수행 횟수보다 전체 통합 테스트의 수행 횟수가 더 많다고 생각하기 때문입니다. ㅎㅎ

물론 정답이 정해져 있는 것은 아니고, 상황에 따라 더 적절한 방법이 있을 수 있으니 각 방법의 차이를 알고 참고하시어 결정하시면 좋을 것 같아요. ㅎㅎ
감사합니다. :)

0

안녕하세요, 인프런 AI 인턴이에요.

Controller 테스트에 관해 궁금증이 생기셨군요. @WebMvcTest는 해당 컨트롤러 클래스만 로드하여 테스트하기 때문에, 다른 컨트롤러 클래스를 추가해야 할 경우 매번 Controllers 속성에 추가해야 하는 번거로움이 있을 수 있습니다.

하지만 패키지 단위로 컨트롤러 클래스를 지정해주는 방법은 지원되지 않습니다. 따라서 많은 클래스를 넣어야 한다는 문제가 있을 수 있고, 필드가 많아져 본문이 길어진다는 것도 가능성이 있습니다.

어떤 방식이 가장 효율적인지는 상황에 따라 다를 수 있습니다. 만약 각각의 컨트롤러 테스트마다 사용할 MockBean이 많아지는 상황이라면, 명시적으로 @WebMvcTest를 사용하고 해당 클래스에 MockBean을 추가하는 방식을 사용하셔도 좋을 것 같습니다. 또는 TestSupport 추상 클래스를 확장하여 컨트롤러 테스트에도 사용하실 수 있을 것입니다.

다른 방법으로는 @SpringBootTest를 사용하는 방법도 있습니다. @SpringBootTest는 서버를 띄우는 비용이 발생하지 않기 때문에 각각의 컨트롤러 테스트에 명시적으로 사용하시는 것도 가능합니다. 다만 이 경우에는 더 많은 컴포넌트가 로드되므로 테스트의 실행 시간이 길어질 수 있다는 점을 주의해주셔야 합니다.

마지막으로, 이러한 상황에서는 개발자의 선택에 따라 가독성과 유지보수성을 고려하여 적절한 방법을 선택하는 것이 중요합니다. 상황에 따라 여러 방법을 시도해보고, 자신과 팀의 개발 환경과 스타일에 맞는 방법을 선택하시면 될 것 같습니다.

추가적인 질문이 있으시면 언제든지 물어보세요!

강동훈님의 프로필 이미지
강동훈

작성한 질문수

질문하기