해결된 질문
작성
·
937
3
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!
먼저 유사한 질문이 있었는지 검색해 보세요.
서로 예의를 지키며 존중하는 문화를 만들어가요.
안녕하세요 강사님 강의 너무 잘 듣고있습니다.
회사에서 Mybatis로 개발 중인데 테스트 코드 작성에 어려움이 있어 질문 드립니다.
JPA의 경우 CRUD가 기본적으로 구현되어 있지만, Mybatis의 경우 xml(또는 인터페이스)에 정의된 메서드를 사용하기 때문에 테스트 코드 작성이 어렵더군요..
만약 Money 테이블이 있고, 해당 Repository에 Select 코드가 없는 경우 어떻게 검증을 해야 좋을까요?
테스트를 위해 xml이나 인터페이스에 새로운 코드를 작성하는 것은 좋은 방법이 아닌 것 같고, Jdbc Template를 이용해봤는데 이 경우에는 데이터가 롤백되지 않는 등의 문제가 있었습니다.( 아마 잘못 사용해서 그런 것 같기도 합니다..)
Repository 부분을 Mock으로 Stub하여 테스트를 진행하는 것도 생각해 보았습니다.
이 경우에는 Repository 쿼리를 수정할 때마다 Service에 정의된 Stub도 그에 맞게 계속 수정해야 하는 문제가 있어서 이 방법도 적합하지 않다고 생각이 들었습니다..(이 케이스도 A,B 각각 모듈 단위의 테스트는 성공하나 결합하여 테스트할 때 실패하는 경우라고 볼 수 있을까요?)
회사가 테스트 코드를 작성하는 문화는 아니어서 물어볼 사람이 없어 질문 남깁니다..
좋은 강의 감사하합니다. 앞으로도 좋은 강의 기대하겠습니다!!
답변 1
4
안녕하세요, endeavor님! :)
이미 많은 고민을 해주셨네요. 먼저 방법을 찾고자 고군분투하신 점 멋지다는 말씀 드리고 싶습니다. 👍
우리가 통합 테스트를 작성할 때를 곰곰히 생각해보면, 결국 서버를 실행하고 검증 시에 findAll() 등을 사용해서 데이터베이스에 저장되어 있는 데이터를 꺼내어 검증한다는 것은, 자동화된 테스트에서 불가피한 행위라는 것을 알 수 있습니다.
when절 수행 후에 디버거를 걸어 놓고 우리가(사람이) DB에 직접 접속해서 눈으로 데이터를 하나하나 확인하고 검증하는 것이 아니라면, 테스트 행위가 기대한대로 잘 수행되었는지를 확인하는 방법은 DB에 저장되어 있는 데이터를 꺼내어 비교 검증하는 방법 밖에 없으니까요.
(사람이 직접 눈으로 확인한다는 것은 애초에 자동화된 테스트가 아니기도 하고요.)
JPA를 사용하나 Mybatis를 사용하나 기술이 달라지더라도, 그 편의성의 차이만 있을 뿐, 방법은 동일합니다.
즉, 강의 중에 JPA에서 미리 정의해 준 findAll()을 편하게 사용했듯이, Mybatis에서도 findAll()을 정의하여 사용하면 되는 것이죠.
물론 말씀 주신 것처럼 프로덕션 코드에서 사용하지 않는 메서드를 정의하는 것에 대한 단점이 명확하게 존재합니다.
특히 findAll()의 경우 프로덕션 코드에서 잘못 사용하면 시스템에 큰 영향을 줄 수도 있기 때문에 더욱 주의가 필요한데요. (실수로 1억 건 짜리 테이블에 findAll()을 하여 where절 없는 조회 쿼리를 날린다던지)
다만 이 또한 Trade-off로, 기술의 한계로 인해 개발자가 스스로 주의하면서 의식적인 사용법을 인지해야 하는 경우가 생길 수 있다는 점을 염두에 두시면 좋을 것 같아요.
프로덕션 코드에서 해당 기능을 의식적으로 사용하지 않을 수 있도록 하는 여러 장치들을 한번 같이 고민해보시면 좋을 것 같습니다. (테스트 환경에서의 설정, 프로퍼티를 별도로 구성할 수 있을지, 하다못해 주석이라도)
도움이 되셨기를 바랍니다.
감사합니다! :)
개발은 항상 Trade-off.. 좋은 답변 감사합니다😀 !!!