webfluxtest를 통한 테스트
수고많으십니다.
mvc만 쓰면서 개발하다보니 junit은 사실 개발을 위한 개발처럼 보여서 쓰지않았습니다.
헌데 reactive로 하려니 하아... junit을 안쓸수가 없겠더군요.
교과목은 아니지만 연관은 있어서 문의하나만 드려봅니다.
한 며칠고민하고 찾아봐도 답이 딱히 나오질않아서 의견을 여쭙거나 합니다.
spring boot 3.2 를쓰고있습니다.
reactive redis를 사용하려니 spring.io에서 제공하는 방법은 ReactiveRedisOperations를 사용하도록 해서 사용하고있습니다.
이걸 서비스에서 만들고 RestController에서 쓰고있습니다.
이 controller를 @WebfluxTest 로 테스트 하려고 했더니.
주입이 안되어서 에러가 발생하는 상황입니다.
@Import등으로 직접 넣어주는데
Controller 에서 서비스 리파지토리정도야 주입해서 넣어야하는건 그럴수있다고 해도
@Configuration에서 등록한 Redis connection factory까지 넣어주어야 한다면
이게 일을 위한 일이 되어버리는 상황이 되겠는데.
지금 내가 테스트를 하는건지 개발을 해야하는건지 의문이 들정도입니다.
아 그리고 @MockBean을 써도 해당 method를 찾지못하기도 하지만
controller 에서 테스트하고싶은것은 repository - service - controller 까지 최종테스트를 하는건데.
이걸 mockbean으로 하는것도 큰의미가 없어보입니다.
controller부분이야 많이 만들수밖에 없을텐데 이때마다 두배의 코딩량을 늘려야하는건 아닌것같은데.
이를 좀더 효율적으로 테스트및 디버깅을 할수는 없는지 궁금하여 문의드립니다.
안녕하세요. 제가 진행하시는 프로젝트에 대해서 자세한 히스토리는 잘 몰라서 저한테 남겨 주신 글을 토대로 원론적인 의견만 드리도록 하겠습니다.
mvc만 쓰면서 개발하다보니 junit은 사실 개발을 위한 개발처럼 보여서 쓰지않았습니다.
헌데 reactive로 하려니 하아... junit을 안쓸수가 없겠더군요.
-> JUnit을 사용해 유닛 테스트 코드를 작성하는데 개발할 때와 비슷한 시간이나 비용이 든다면 구현 로직 자체가 테스트 하기 어렵게 짜여져 있지 않을까 하는 생각이 들구요. Spring MVC와 Spring WebFlux가 서로 난이도가 다르고, 동작하는 방식이 다르긴하지만 JUnit이 TentNG, Spock 등을 이용해서 테스트 코드를 작성하는건 반드시 필요하다는게 개인적인 생각입니다.
아 그리고 @MockBean을 써도 해당 method를 찾지못하기도 하지만
controller 에서 테스트하고싶은것은 repository - service - controller 까지 최종테스트를 하는건데.
이걸 mockbean으로 하는것도 큰의미가 없어보입니다.
--> 말씀하신대로 각각의 계층을 모두 거치는 테스트라면 슬라이스 테스트라고 보기 힘들기 때문에 @MockBean을 이용하는 것이 큰 의미가 없을 것 같습니다.
controller부분이야 많이 만들수밖에 없을텐데 이때마다 두배의 코딩량을 늘려야하는건 아닌것같은데.
이를 좀더 효율적으로 테스트및 디버깅을 할수는 없는지 궁금하여 문의드립니다.
--> Controller의 테스트 코드는 API 문서 자동화와 관련이 있기 때문에 API 문서를 자동화 하고 싶다면 Controller에 대한 테스크 코드는 빠르게 작성할 수 있어야 할 것 같습니다.
이 외의 비즈니스 로직을 테스트 하기 용이한 코드를 작성하기 위해 서비스 계층 이외에 별도의 도메인 계층을 추가해서 테스트 코드의 복잡성, 기술의 종속성 등을 최소화 할 수 있을거라고 생각합니다.
이렇게 하면 StepVerifier나 TestPublisher 등을 이용해서 Reactor Operator 체인을 테스트 하는데 조금 더 단순해 질거라 생각됩니다.
답글
가족의미래를위해
2024.01.01답변감사드립니다.
문서자동화는 기대도 안합니다.
controller부분을 좀더 나은 방법으로 테스트를 할수없을지 한번에는 불가할지. 보는중입니다.
junit없이 바로바로 데이터 찍어보면서 하다가.
junit을 쓰려니 이런저런 구성을 계속 알아보고있었습니다.
service나 repository정도는 사실 강의에서 알려주신 StepVerifier로 해결이 되겠더군요.
헌데 이컨트롤러부분은 endpoint라서 webserver가 필요하고 모든 service와 repository의 통합테스트라고 보고있습니다.
다른 업체나 다른 프로젝트에서는 이 컨트롤러를 어떤시각으로보는지 모르겠으나.
전 이 controller 부분이 제일 고민스럽습니다.
@WebfluxTest를 통해서 구성하면 사실 왜 @service , @repository등을 빼버리는지 솔직히 spring을 만든양반들의 의도를 솔직히 모르겠습니다.
controller도 단위테스트만 하는건가?
제가 볼땐 controller + service + repository다 제대로 주입이 되고 작동이 되어서 테스트가 되어야할것같은데 이 주입에서 제외시켜버리다보니 난감하고 있습니다.
그래서 역으로 하나하나 import하고 주입시키다가 화딱지나서 문서를 여기저기 뒤져보고 하다가 답답해서 여쭙게 되었습니다.
junit도 궁금은 했지만 볼겨를 없이 얼른 만들어서 바로바로 서비스에 적용하던 세월을 보내고 살다가 이제 정말 필요한시점이 되어서 다행스럽게도 강의에서 실마리를 주셔서 감사하게 생각합니다.
새해복많이 받으시고 혹시 저 고민스러운 controller부분은 어떻게 하시는지 방향만이라도 알려주시면 감사드리겠습니다.
정말 하나하나 주입시키는게 맞다면 한숨푹쉬고 ;;; 그냥 하나하나 주입시키면서 하는게 아닌
다른좋은 방안이 있다면 알려주시면 좋겠습니다. (__)
Kevin
2024.01.01음.. 결국 Controller -> Service -> Repository를 거치는 일종의 통합 테스트를 편리하게 할 수 있는 방법을 원하시는것 같은데
@SpringBootTest
애너테이션과WebTestClient
를 함께 사용해서 테스트를 수행해 보시겠어요?@WebFluxTest
는 필요한 의존성에 대해서 일일이 관리를 해야 하지만@SpringBootTest
애너테이션은 전체 Application Context를 알아서 로드해 주기 때문에 통합테스트에 적합하다고 생각합니다.가족의미래를위해
2024.01.01네 현재까지는 천상 통합테스트는 웹서버를 띄우고 webtestclient를 통해서 엑세스하는방식과
controller에서 service mockbean으로 controller 단위테스트를 하는것으로 마무리하고 있습니다
아우 얼마나 한줄기 희망이되어주시는지 아십니까?
제 주위에선 아직도 mvc 레거시에서 못벗어나고있습니다.
물어볼곳이 너무 없어서 혼자 인터넷만 뒤지는데 답답할때가 많습니다.
그래서
이렇게 답변주시는게 저의 두통약이자 소화제입니다
감사합니다.